Пакет net/http встроенных функций и типов языка Go
Categories:
Benefits:
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.