Оригинальный автор, публичный аккаунт [программист чтение], прошу обратить внимание на паблик-аккаунт, просьба указывать источник перепечатываемой статьи.
Разработка веб-приложений на языке Go на самом деле очень проста, потому что в стандартной библиотеке языка Go есть очень зрелые и простые пакеты для веб-разработки:net/http.
Net/http инкапсулирует большинство функций, необходимых для разработки веб-приложений, поэтому при использовании net/http для разработки веб-приложений на языке Go нам даже не нужно создавать Apache или веб-приложение, как в других языках (таких как как PHP), nginx и другие веб-серверы, но для создания приложения веб-службы требуется всего несколько строк кода.
Веб-основы
Конечно, несмотря на то, что с помощью пакета Go net/http можно легко разрабатывать веб-приложения, нам все равно необходимо твердо усвоить базовые знания, необходимые для разработки веб-программ в процессе разработки, а самые основные и основные знания в веб-разработке:HTTP协议.
Протокол http — это язык и спецификация для связи между веб-сервером и клиентом (наиболее распространенным является браузер). Браузер инициирует запрос к сети, а веб-сервер отвечает и завершает соединение. Весь процесс показан на следующий рисунок:
запрос и ответ
Полная 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 нужно еще многому научиться.
Ваше внимание — самое большое поощрение на моем писательском пути!