Я довольно долго работал над slack-приложением OnThisDay и прервал работу для мозгового штурма (с самим собой), а также для подготовки к экзаменам в середине семестра. Пока я формировал алгоритм в своем подсознании, я чуть не забыл начать с ним работу. А потом был семинар KOSS по веб-серверам с использованием Go :wink:

Кшитий Сараоги был нашим инструктором, и эта статья в форме разговора между мной и ним; а может быть и настоящий, никогда не знаешь. Кроме того, я бы порекомендовал, если статья вызывает интерес (и стремление лучше понять) для серверов Go, взгляните на упомянутый проект и просмотрите файл сервера.

Никогда не недооценивайте сообразительность глупого ученика!

«Подождите секунду! Я не знаю, что такое API, Кшитий?»
API означает интерфейс прикладного программирования; и, как следует из названия, это интерфейс, с помощью которого пользователь может общаться и выполнять приложения. В нашем использовании мы можем понимать API как путь на сервере (например, «https://example.com/path/to/endpoint»), по которому можно отправить запрос (технический термин тот же) и получить ответ.

Что мы подразумеваем под веб-сервером?
Сервер – это компьютер, к которому могут обращаться для получения информации/операций другие компьютеры (называемые клиентами) в той же сети. Веб-сервер в нашем приложении подразумевает интерфейс, к которому можно получить доступ как к веб-сайту (вроде); с URI (унифицированным идентификатором ресурса) и в браузере (или с запросом).

Еще один вопрос; Собираемся ли мы учиться размещать WebAPI?
Нет, мы подойдем к этапу, на котором у нас будет простой сервер, работающий на локальном хост-порту 8080. Для хостинга из собственной системы нам нужно погрузиться в такие темы, как перенаправление портов и ngrok.

Нигде не может быть проще настроить минималистичный сервер с помощью Go. Я настроил простой сервер с двумя конечными точками: «init», который обслуживает статическую веб-страницу с кнопкой, и «redirect», который принимает код из Slack Web API, а затем инициирует другой запрос с соответствующими параметрами для аутентификации (не важно для этого). статья).

Прежде всего, нам нужно определить пакет в файле go и указать импорт в формате следующего фрагмента. Важным пакетом является «net/http», который обрабатывает все операции, связанные с http, как мы увидим.

package main

import (
    "fmt"
    "net/http"
)

Имя пакета — это уникальное имя, которое идентифицирует (и одновременно создает) все файлы одной и той же программы (или проекта). Так же, как C (или C++), GoLang должен иметь основную функцию, которая выполняется первой. Мы создаем внутри него функцию OAutherver().

func main() {
    OAuthServer()
}

OAuthServer состоит в основном из трех частей; мультиплексор, назначение обработчиков и запуск и прослушивание основного сервера. Мы определяем порт для обслуживания веб-приложения (здесь это будет 8080). Встроенные функции net/http говорят сами за себя. Кроме того, нам нужен мультиплексор для маршрутизации (перенаправления) трафика, поступающего на один и тот же порт, в разные пункты назначения на основе вызываемого URI.

func OAuthServer() {
    PORT := ":8080" 
    mux := http.DefaultServeMux
    mux.HandleFunc("/init", InitHandler) // A simple button (for testing)
    mux.HandleFunc("/redirect", RedirectHandler) // Redirected to code here, IMP
    http.ListenAndServe(PORT, mux)
}

Приведенный выше код настраивает скелетный сервер с двумя вышеупомянутыми конечными точками, вызывающими функции InitHandler и RedirectHandler. Эти методы представляют собой две функции, которые вызываются всякий раз, когда их соответствующие конечные точки. Далее следует пример функции,

func InitHandler(w http.ResponseWriter, r *http.Request) {
    // serves the test webpage to init the process
    http.ServeFile(w, r, "src/test.html")
}

Функция просто возвращает простой HTML-файл («src/test.html») клиенту (ПК), который получил доступ к конечной точке. В этом методе можно разместить простой веб-сайт, используя мультиплексор GoLang и http. Теперь все, что осталось сделать, это написать логику (и код) для RedirectHandler и запустить файл .go, чтобы сервер находился в localhost:8080/init.

Здесь важно отметить, что функция-обработчик всегда принимает два аргумента: ответ и запрос. Ответ — это ваш вывод (в некотором роде) для пользователя, и вы понимаете, что он используется для обработки ваших «разговоров» с пользователем. Точно так же, когда пользователь получает доступ к вашей конечной точке, он «разговаривает» с вашим сервером, и этот запрос информации принимается как указатель запроса.

Ниже приведен весь код с двумя конечными точками и гораздо большей обработкой журналов, а также командами печати, которые легко понять с небольшими усилиями и с помощью Google.

package main

import (
    "fmt"
    "log"
    "net/http"
)

const PORT = ":8080"

func main() {
    log.Println("Launching the OAuth Sever on port " + PORT[1:])
    OAuthServer()
    log.Fatal("Server shutdown!")
}

func OAuthServer() {
    // using mux instead of direct http handling
    mux := http.DefaultServeMux
    mux.HandleFunc("/init", InitHandler)
    log.Println("Init handler setup.")
    mux.HandleFunc("/redirect", RedirectHandler)
    log.Println("Redirect handler setup,")
    log.Println("Listening on the port...")
    err := http.ListenAndServe(PORT, mux)
    if err != nil {
        log.Println("Failed to start the server!")
        log.Fatal("%+v", err)
    }
}

func InitHandler(w http.ResponseWriter, r *http.Request) {
    // serves the test text
    log.Println("InitHandler accessed!")  // not printed in browser
    fmt.Fprintln(w, "This line printed in browser!")
    // further logic here
}

func RedirectHandler(w http.ResponseWriter, r *http.Request) {
    // Handles redirect
    
    log.Println("RedirectHandler accessed!")  // not printed in browser
    fmt.Fprintln(w, "This line printed in browser!")
    // further logic here
}

Большая часть приведенного выше кода очень проста и понятна, и в этих нескольких строках мы создали наш первый сервер. Если вы впервые слышите о go, я бы посоветовал вам научиться его устанавливать и запускать приведенный выше код.

увидеть волшебство своими глазами, оно выглядит более величественно.

Я не задумывал это как учебник и не считаю это таковым; это просто введение в то, как легко использовать GoLang для создания серверов, и это должно посеять любопытство.

Если у вас есть немного времени и энтузиазма, проверьте проект, на котором основана эта статья.

Эта статья изначально была размещена на моем собственном сайте.