Я довольно долго работал над 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 для создания серверов, и это должно посеять любопытство.
Если у вас есть немного времени и энтузиазма, проверьте проект, на котором основана эта статья.
Эта статья изначально была размещена на моем собственном сайте.