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