Пакет net/http встроенных функций и типов языка Go

Пакет 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, когда закончит с ним работать:

resp, err := http.Get("http://example.com/")
if err != nil {
	// handle error
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
// ...

Клиенты и транспорты (Clients and Transports)

Для управления HTTP-заголовками, политикой перенаправлений (redirects) и другими настройками клиента, создайте 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, сжатие и др.) настройте http.Transport:

tr := &http.Transport{
    MaxIdleConns:       10,               // макс. число бездействующих соединений
    IdleConnTimeout:    30 * time.Second, // таймаут для idle-соединений
    DisableCompression: true,             // отключение сжатия (gzip)
}
client := &http.Client{Transport: tr}
resp, err := client.Get("https://example.com")

Важно:

  • Client и Transport потокобезопасны (можно использовать в нескольких горутинах).
  • Их следует создавать один раз и переиспользовать для эффективности.

Серверы (Servers)

ListenAndServe запускает HTTP-сервер с указанным адресом и обработчиком (handler). Если handler = nil, используется DefaultServeMux:

http.Handle("/foo", fooHandler)  // регистрация обработчика для пути "/foo"

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)) // запуск сервера на :8080

Для тонкой настройки сервера создайте http.Server:

s := &http.Server{
    Addr:           ":8080",         // адрес сервера
    Handler:        myHandler,       // кастомный обработчик
    ReadTimeout:    10 * time.Second, // таймаут на чтение запроса
    WriteTimeout:   10 * time.Second, // таймаут на запись ответа
    MaxHeaderBytes: 1 << 20,         // макс. размер заголовков (1 MB)
}
log.Fatal(s.ListenAndServe())

Поддержка HTTP/2

С Go 1.6+ HTTP/2 поддерживается автоматически при использовании HTTPS.

Как отключить HTTP/2?

  • Для клиента: задать Transport.TLSNextProto = make(map[string]func(...)) (пустой map).
  • Для сервера: задать Server.TLSNextProto = make(map[string]func(...)).

Через переменную GODEBUG:

GODEBUG=http2client=0  # отключить HTTP/2 для клиентов  
GODEBUG=http2server=0  # отключить HTTP/2 для серверов  
GODEBUG=http2debug=1   # логировать отладочную информацию  
GODEBUG=http2debug=2   # расширенные логи (дампы фреймов)  

Перед отключением HTTP/2 сообщите о проблеме: golang.org/s/http2bug.

Расширенная настройка HTTP/2
Для сложных сценариев (например, ручная конфигурация HTTP/2) используйте пакет golang.org/x/net/http2:

import "golang.org/x/net/http2"

// Для клиента:
http2.ConfigureTransport(tr) // tr — ваш *http.Transport

// Для сервера:
http2.ConfigureServer(s, nil) // s — ваш *http.Server

Ручная настройка через golang.org/x/net/http2 имеет приоритет над встроенной поддержкой HTTP/2 в net/http.


Ключевые термины

  • DefaultServeMux – стандартный муксер (роутер) HTTP-запросов.
  • Transport – управление низкоуровневыми параметрами HTTP-соединений.
  • TLSNextProto – настройка протоколов, работающих поверх TLS (например, HTTP/2).
  • GODEBUG – переменная окружения для отладки поведения Go-программ.

Константы

const (
	MethodGet     = "GET"
	MethodHead    = "HEAD"
	MethodPost    = "POST"
	MethodPut     = "PUT"
	MethodPatch   = "PATCH" // RFC 5789
	MethodDelete  = "DELETE"
	MethodConnect = "CONNECT"
	MethodOptions = "OPTIONS"
	MethodTrace   = "TRACE"
)

Общие методы HTTP. Если не указано иное, они определены в разделе 4.3 RFC 7231.

const (
	StatusContinue           = 100 // RFC 9110, 15.2.1
	StatusSwitchingProtocols = 101 // RFC 9110, 15.2.2
	StatusProcessing         = 102 // RFC 2518, 10.1
	StatusEarlyHints         = 103 // RFC 8297

	StatusOK                   = 200 // RFC 9110, 15.3.1
	StatusCreated              = 201 // RFC 9110, 15.3.2
	StatusAccepted             = 202 // RFC 9110, 15.3.3
	StatusNonAuthoritativeInfo = 203 // RFC 9110, 15.3.4
	StatusNoContent            = 204 // RFC 9110, 15.3.5
	StatusResetContent         = 205 // RFC 9110, 15.3.6
	StatusPartialContent       = 206 // RFC 9110, 15.3.7
	StatusMultiStatus          = 207 // RFC 4918, 11.1
	StatusAlreadyReported      = 208 // RFC 5842, 7.1
	StatusIMUsed               = 226 // RFC 3229, 10.4.1

	StatusMultipleChoices  = 300 // RFC 9110, 15.4.1
	StatusMovedPermanently = 301 // RFC 9110, 15.4.2
	StatusFound            = 302 // RFC 9110, 15.4.3
	StatusSeeOther         = 303 // RFC 9110, 15.4.4
	StatusNotModified      = 304 // RFC 9110, 15.4.5
	StatusUseProxy         = 305 // RFC 9110, 15.4.6

	StatusTemporaryRedirect = 307 // RFC 9110, 15.4.8
	StatusPermanentRedirect = 308 // RFC 9110, 15.4.9

	StatusBadRequest                   = 400 // RFC 9110, 15.5.1
	StatusUnauthorized                 = 401 // RFC 9110, 15.5.2
	StatusPaymentRequired              = 402 // RFC 9110, 15.5.3
	StatusForbidden                    = 403 // RFC 9110, 15.5.4
	StatusNotFound                     = 404 // RFC 9110, 15.5.5
	StatusMethodNotAllowed             = 405 // RFC 9110, 15.5.6
	StatusNotAcceptable                = 406 // RFC 9110, 15.5.7
	StatusProxyAuthRequired            = 407 // RFC 9110, 15.5.8
	StatusRequestTimeout               = 408 // RFC 9110, 15.5.9
	StatusConflict                     = 409 // RFC 9110, 15.5.10
	StatusGone                         = 410 // RFC 9110, 15.5.11
	StatusLengthRequired               = 411 // RFC 9110, 15.5.12
	StatusPreconditionFailed           = 412 // RFC 9110, 15.5.13
	StatusRequestEntityTooLarge        = 413 // RFC 9110, 15.5.14
	StatusRequestURITooLong            = 414 // RFC 9110, 15.5.15
	StatusUnsupportedMediaType         = 415 // RFC 9110, 15.5.16
	StatusRequestedRangeNotSatisfiable = 416 // RFC 9110, 15.5.17
	StatusExpectationFailed            = 417 // RFC 9110, 15.5.18
	StatusTeapot                       = 418 // RFC 9110, 15.5.19 (Unused)
	StatusMisdirectedRequest           = 421 // RFC 9110, 15.5.20
	StatusUnprocessableEntity          = 422 // RFC 9110, 15.5.21
	StatusLocked                       = 423 // RFC 4918, 11.3
	StatusFailedDependency             = 424 // RFC 4918, 11.4
	StatusTooEarly                     = 425 // RFC 8470, 5.2.
	StatusUpgradeRequired              = 426 // RFC 9110, 15.5.22
	StatusPreconditionRequired         = 428 // RFC 6585, 3
	StatusTooManyRequests              = 429 // RFC 6585, 4
	StatusRequestHeaderFieldsTooLarge  = 431 // RFC 6585, 5
	StatusUnavailableForLegalReasons   = 451 // RFC 7725, 3

	StatusInternalServerError           = 500 // RFC 9110, 15.6.1
	StatusNotImplemented                = 501 // RFC 9110, 15.6.2
	StatusBadGateway                    = 502 // RFC 9110, 15.6.3
	StatusServiceUnavailable            = 503 // RFC 9110, 15.6.4
	StatusGatewayTimeout                = 504 // RFC 9110, 15.6.5
	StatusHTTPVersionNotSupported       = 505 // RFC 9110, 15.6.6
	StatusVariantAlsoNegotiates         = 506 // RFC 2295, 8.1
	StatusInsufficientStorage           = 507 // RFC 4918, 11.5
	StatusLoopDetected                  = 508 // RFC 5842, 7.2
	StatusNotExtended                   = 510 // RFC 2774, 7
	StatusNetworkAuthenticationRequired = 511 // RFC 6585, 6
)

HTTP коды состояния (HTTP status codes)

Коды состояния HTTP зарегистрированы в IANA. См.: https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml

Константы

const DefaultMaxHeaderBytes = 1 << 20 // 1 МБ

DefaultMaxHeaderBytes - максимально допустимый размер заголовков в HTTP-запросе. Можно переопределить через [Server.MaxHeaderBytes].

const DefaultMaxIdleConnsPerHost = 2

DefaultMaxIdleConnsPerHost - значение по умолчанию для Transport.MaxIdleConnsPerHost.

const TimeFormat = "Mon, 02 Jan 2006 15:04:05 GMT"

TimeFormat - формат времени для генерации временных меток в HTTP-заголовках. Аналогичен time.RFC1123, но использует GMT. Время должно быть в UTC.

const TrailerPrefix = "Trailer:"

TrailerPrefix - префикс для ключей [ResponseWriter.Header], указывающий, что значение относится к трейлерам ответа, а не к заголовкам.

Переменные

var (
    ErrNotSupported = &ProtocolError{"feature not supported"}
    ErrMissingBoundary = &ProtocolError{"no multipart boundary param in Content-Type"}
    ErrNotMultipart = &ProtocolError{"request Content-Type isn't multipart/form-data"}
    // Устаревшие ошибки...
)
var (
    ErrBodyNotAllowed = errors.New("http: request method or response status code does not allow body")
    ErrHijacked = errors.New("http: connection has been hijacked")
    ErrContentLength = errors.New("http: wrote more than the declared Content-Length")
    // Устаревшие ошибки...
)

Ошибки, используемые HTTP-сервером.

var (
    ServerContextKey = &contextKey{"http-server"}
    LocalAddrContextKey = &contextKey{"local-addr"}
)

Ключи контекста для доступа к серверу и локальному адресу.

var DefaultClient = &Client{}

DefaultClient - клиент по умолчанию, используемый Get, Head и Post.

var DefaultServeMux = &defaultServeMux

DefaultServeMux - ServeMux по умолчанию, используемый Serve.

var ErrAbortHandler = errors.New("net/http: abort Handler")

ErrAbortHandler - значение для прерывания обработчика без логирования стека.

var ErrBodyReadAfterClose = errors.New("http: invalid Read on closed Body")

Ошибка при чтении закрытого тела запроса/ответа.

var NoBody = noBody{}

NoBody - пустое тело запроса (io.ReadCloser), всегда возвращает EOF.