суббота, 23 марта 2019 г.

Пакет net/http, краткий обзор

Пакет 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 пакете.


Читайте также:


Комментариев нет:

Отправить комментарий