Пакет http предоставляет реализации HTTP клиента и сервера.
Get, Head, Post, и PostForm выполняют HTTP (или HTTPS) запросы:
resp, err := http.Get("http://example.com/")
...
resp, err := http.Post("http://example.com/upload", "image/jpeg", &buf)
...
resp, err := http.PostForm("http://example.com/form",
url.Values{"key": {"Value"}, "id": {"123"}})
Клиент должен закрывать тело ответа когда закончил с ним работать:
resp, err := http.Get("http://example.com/")
if err != nil {
// handle error
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
// ...
Для контроля над клиентскими HTTP заголовками, политикой перенаправлений, и другими настройками создавайте Client:
client := &http.Client{
CheckRedirect: redirectPolicyFunc,
}
resp, err := client.Get("http://example.com")
// ...
req, err := http.NewRequest("GET", "http://example.com", nil)
// ...
req.Header.Add("If-None-Match", W/"wyzzy")
resp, err := client.Do(req)
// ...
Для контроля над прокси, TLS конфигурацией, сохранения открытого соединения (keep-alive), сжатием, и другими настройками, создавайте Transport:
tr := &http.Transport{
MaxIdleConns: 10,
IdleConnTimeout: 30 * time.Second,
DisableCompression: true,
}
client := &http.Client{Transport: tr}
resp, err := client.Get("https://example.com")
Client и Transport безопасны для конкурентного использования несколькими go-процедурами (goroutines) и для эффективности должны быть созданы только однажды и повторно использоваться.
ListenAndServe стартует HTTP-сервер с заданным адресом и обработчиком (handler). Обработчик (handler) обычно равен nil, что означает использовать DefaultServeMux. Handle и HandleFunc добавляют обработчики к DefaultServeMux:
http.Handle("/foo", fooHandler)
http.HandleFunc("/bar", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path))
})
log.Fatal(http.ListenAndServe(":8080", nil))
Больше контроля над поведением сервера доступно посредством создания пользовательского Server:
s := &http.Server{
Addr: ":8080",
Handler: myHandler,
ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
MaxHeaderBytes: 1 << 20,
}
log.Fatal(s.ListenAndServe())
Начиная с Go 1.6, http пакет имеет прозрачную поддержку HTTP/2 протокола при использовании HTTPS. Программы которые должны отключить HTTP/2 могут сделать это посредством настройки Transport.TLSNextProto (для клиентов) или Server.TLSNextProto (для серверов) к не-nil, пустой map. В качестве альтернативы на данный момент поддерживаются следующие переменные окружения GODEBUG:
GODEBUG=http2client=0 # отключаем клиентскую поддержку HTTP/2
GODEBUG=http2server=0 # отключаем серверную поддержку HTTP/2
GODEBUG=http2debug=1 # включаем подробные HTTP/2 отладочные логи
GODEBUG=http2debug=2 # ... еще более подробные, с дампами фреймов
В пакете http Transport и Server оба автоматически включают HTTP/2 поддержку в простых конфигурациях. Для включения HTTP/2 для более сложных конфигураций, для использования низкоуровневых HTTP/2 возможностей, или для использования новой версии Go http2 пакета выполняйте import "golang.org/x/net/http2" напрямую и используйте его ConfigureTransport и/или ConfigureServer функции. Ручное конфигурирование HTTP/2 посредством golang.org/x/net/http2 пакета имеет первенство над встроенной поддержкой HTTP/2 в net/http пакете.
Читайте также:
- Веб-приложение на Go: введение в пакет net/http, пример веб-сервера на Go
- Эффективный Go: веб-сервер
- Go примеры: Hello, gopher!
Комментариев нет:
Отправить комментарий