Руководство по веб-разработке Go

Go

Оригинальный автор, публичный аккаунт [программист чтение], прошу обратить внимание на паблик-аккаунт, просьба указывать источник перепечатываемой статьи.

Разработка веб-приложений на языке Go на самом деле очень проста, потому что в стандартной библиотеке языка Go есть очень зрелые и простые пакеты для веб-разработки:net/http.

Net/http инкапсулирует большинство функций, необходимых для разработки веб-приложений, поэтому при использовании net/http для разработки веб-приложений на языке Go нам даже не нужно создавать Apache или веб-приложение, как в других языках (таких как как PHP), nginx и другие веб-серверы, но для создания приложения веб-службы требуется всего несколько строк кода.

Веб-основы

Конечно, несмотря на то, что с помощью пакета Go net/http можно легко разрабатывать веб-приложения, нам все равно необходимо твердо усвоить базовые знания, необходимые для разработки веб-программ в процессе разработки, а самые основные и основные знания в веб-разработке:HTTP协议.

Протокол http — это язык и спецификация для связи между веб-сервером и клиентом (наиболее распространенным является браузер). Браузер инициирует запрос к сети, а веб-сервер отвечает и завершает соединение. Весь процесс показан на следующий рисунок:

Изображение взято из The Definitive Guide to HTTP

запрос и ответ

Полная http-транзакция состоит из запроса клиента и ответа веб-сервера. Запрос, инициированный клиентом, состоит из трех частей:请求行,请求头и请求体, а ответ веб-сервера также состоит из трех частей:响应行,响应头и响应体,Как показано ниже:.

Изображение взято из The Definitive Guide to HTTP

Соответствующее знание протокола http намного больше, чем это, мы поговорим об этом, когда у нас будет время.

Несколько способов создать веб-сервер в Go

Функция http.HandleFunc

Использование функции HandleFunc — это функция, инкапсулированная в http и может использоваться напрямую.Первый параметр — это путь веб-запроса, а второй параметр —func(writer http.ResponseWriter, request *http.Request)функция.

повторное использованиеhttp.ListenAndServe(":8080",nil)заявление, прослушивание8080порт после запуска программы.

Используя http://localhost:8080, он выведет一起学习Go Web编程吧.

вhttp.ResponseWriterпредставляет тело ответа клиенту, аhttp.RequestОтправляет данные запроса сервера от имени клиента.

func hello(writer http.ResponseWriter, request *http.Request) {
    writer.Write([]byte("一起学习Go Web编程吧"));
}

func main(){
    http.HandleFunc("/hello",hello)
    log.Fatal(http.ListenAndServe(":8080",nil))
}

http.Handle функция

иHandleFuncТакой же,HandleЭто также функция, инкапсулированная http.Первый параметр такой же, какHandleFuncТо же самое, и второй параметр должен быть реализованhttp.Handlerтип интерфейса,http.HandlerОпределение в пакете http выглядит следующим образом:

type Handler interface {
	ServeHTTP(ResponseWriter, *Request)
}

Затем мы определяем структуру Controller, в которой определен метод ServeHTTP, поэтому структура Controller также реализует интерфейс http.Handler и черезhttp.HandlerFuncВы также можете преобразовать метод hello в реализациюhttp.HandlerFunc,http.HandlerFuncтакже понялhttp.Handler,http.HandlerFuncОпределение в пакете http выглядит следующим образом:

type HandlerFunc func(ResponseWriter, *Request)

// ServeHTTP calls f(w, r).
func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
	f(w, r)
}

На самом деле, в приведенном выше примере мы передаем hellohttp.HandleFuncфункция,HandleFuncтакже используется функцияhttp.HandlerFuncпреобразовать привет вhttp.HandlerFuncиз.

Вот пример http.Handle:

type Controller struct {}
func (c Controller)ServeHTTP(writer http.ResponseWriter, request *http.Request){
    writer.Write([]byte("hello,1"));
}

func hello(writer http.ResponseWriter, request *http.Request) {
    writer.Write([]byte("hello,2"));
}

func main(){
    http.Handle("/hello1",&Controller{})
    http.Handle("/hello2",http.HandlerFunc(hello))
    log.Fatal(http.ListenAndServe(":8080",nil))
}

После запуска программы введите в браузере следующий адрес:

http://localhost:8080/hell1, вывод: привет,1

http://localhost:8080/hell2, вывод: привет,2

http.ServeMux

либо использоватьhttp.Handleвсе ещеhttp.HandleFuncфункция, на самом деле используется базовый кодhttp.DefaultServeMux,DefaultServeMuxОпределение показано в следующем коде:

var DefaultServeMux = &defaultServeMux

var defaultServeMux ServeMux
type Controller struct {}
func (c Controller)ServeHTTP(writer http.ResponseWriter, request *http.Request){
    writer.Write([]byte("hello,1"));
}

func hello(writer http.ResponseWriter, request *http.Request) {
    writer.Write([]byte("hello,2"));
}

func main(){
    mux := &http.ServeMux{}
    mux.HandleFunc("/hello1",hello)
    mux.Handle("/hello2",http.HandlerFunc(hello))
    mux.Handle("/hello3",&Controller{})

    log.Fatal(http.ListenAndServe(":8080",mux))
}

После запуска программы введите в браузере следующий адрес:

http://localhost:8080/hell1, вывод: привет,1

http://localhost:8080/hell2, вывод: привет,1

http://localhost:8080/hell3, вывод: привет,2

http.Server

http.ServerЭто низкоуровневая поддержка Интернета в пакете http.Все методы, которые мы использовали ранее, верны.http.ServerПакет только, если вы используете его напрямуюhttp.Server, вы можете настроить больше параметров, если время ожидания соединения истекло и другие параметры, поэтому мы используем следующие непосредственноhttp.ServerРазрабатывать веб-сервисы.

func main() {
    myHandler := &http.ServeMux{}
    myHandler.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("hello"))
    })
    s := &http.Server{
        Addr:           ":8080",
        Handler:        myHandler,
        ReadTimeout:    10 * time.Second,
        WriteTimeout:   10 * time.Second,
        MaxHeaderBytes: 1 << 20,
    }
    log.Fatal(s.ListenAndServe())
}

После запуска программы введите в браузере следующий адрес:

http://localhost:8080/hello, вывод: привет

Суммировать

Из приведенного выше примера видно, что веб-разработка на Go очень проста, но на самом деле настоящее веб-приложение должно делать гораздо больше, чем просто.Для веб-разработки на Go нужно еще многому научиться.


Ваше внимание — самое большое поощрение на моем писательском пути!