Материал

HTTP

Этап roadmapHTTP и API →

HTTP (Hypertext Transfer Protocol) — прикладной протокол обмена сообщениями между клиентами и серверами. Изначально он создавался для передачи гипертекстовых документов. В модели OSI HTTP относят к прикладному уровню; в стеке TCP/IP — также к прикладному уровню.

Протокол HTTP работает по принципу клиент-сервер. Клиентское приложение формирует запрос и отправляет его на сервер, после чего сервер обрабатывает запрос, формирует ответ и передаёт его обратно клиенту. Структуры запроса и ответа HTTP/1.1 похожи: стартовая строка, заголовки и необязательное тело сообщения.

  • Стартовая строка запроса состоит из метода, пути и версии протокола: GET /index.html HTTP/1.1 Стартовая строка ответа состоит из версии протокола, кода ответа и текстовой расшифровки ответа: HTTP/1.1 200 OK
  • Заголовки – это набор пар ключ-значение, например, Content-Type: text/html; charset=utf-8. В заголовках передают метаданные запроса/ответа: язык пользователя, авторизацию, тип контента и т. д.
  • Тело запроса или ответа может отсутствовать либо содержать текстовые или бинарные данные. В HTTP/1.1 оно отделяется от заголовков пустой строкой. Обычный порт для HTTP — 80, для HTTPS — 443. HTTPS — это HTTP поверх TLS: TLS обеспечивает шифрование, целостность и аутентификацию сервера. Сегодня используются HTTP/1.1, HTTP/2 и HTTP/3. HTTP/2 обычно работает поверх TCP, а HTTP/3 — поверх QUIC, использующего UDP. Особенности HTTP/1.1:
  • постоянные соединения используются по умолчанию; заголовок Connection: close сообщает, что соединение нужно закрыть после ответа; Нововведения HTTP/2:
  • бинарное фреймирование: сообщения передаются как последовательности типизированных фреймов;
  • мультиплексирование: несколько потоков запросов и ответов могут одновременно использовать одно соединение;
  • сжатие заголовков: используется формат HPACK;
  • server push: протокол предусматривает отправку дополнительных ответов без отдельного запроса, однако браузеры больше не поддерживают эту возможность как практическую оптимизацию.

Стандарт HTTP/2 допускает работу без TLS, но современные браузеры практически используют его только поверх TLS.

HTTP методы

Прокрутите таблицу по горизонтали →

Метод Что делает Пример эндпоинта Safe Idempotent
POST отправляет данные на сервер /photos No No
PUT обновляет существующий ресурс, иногда может создавать новый; нужно передать полное представление ресурса /photos/id No Yes
PATCH вносит изменения в конкретный ресурс /photos/id No No
GET запрашивает информацию /photos, /photos/id Yes Yes
HEAD идентичен GET по семантике, но сервер не отправляет тело ответа /photos, /photos/id Yes Yes
DELETE удаляет ресурс /photos/id No Yes
OPTIONS запрашивает варианты взаимодействия с целевым ресурсом; часто используется для preflight-запросов CORS /photos Yes Yes
TRACE используется для тестирования и отладки соединения между клиентом и сервером /photos Yes Yes

Идемпотентность — свойство метода, при котором ожидаемый эффект нескольких одинаковых запросов на сервере совпадает с эффектом одного такого запроса. Ответы при этом могут различаться. PATCH по стандарту не обязан быть идемпотентным, но конкретный PATCH-запрос можно спроектировать идемпотентно.

Пример запроса:

GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:100.0) Gecko/20100101 Firefox/100.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1

Пример ответа:

HTTP/1.1 200 OK
Date: Mon, 27 Nov 2023 12:00:00 GMT
Server: Apache/2.4.29 (Unix)
Last-Modified: Wed, 01 Nov 2023 10:00:00 GMT
ETag: "a1f-5c001a1f364d8"
Accept-Ranges: bytes
Content-Type: text/html

<!DOCTYPE html>
<html>
<head>
    <title>Example Page</title>
</head>
<body>
    <h1>Hello, World!</h1>
    <p>This is an example page.</p>
</body>
</html>

Примеры кодов ответов

  • 1xx - информационные
  • 100 Continue - запрос успешно принят и клиент может продолжать присылать запросы
  • 101 Switching Protocols - присылается в ответ на запрос клиента, содержащий заголовок Upgrade, и указывает, что сервер переключился на согласованный протокол
  • 2хх - успешно
  • 200 OK - запрос успешно обработан
  • 201 Created - запрос выполнен и привёл к созданию одного или нескольких ресурсов
  • 3хх - перенаправление
  • 304 Not Modified - условный GET или HEAD показал, что сохранённое клиентом представление всё ещё актуально
  • 307 Temporary Redirect - временное перенаправление
  • 4хх - ошибка на стороне клиента
  • 401 Unauthorized - для получения запрашиваемого ответа нужна аутентификация
  • 403 Forbidden - у клиента нет прав доступа к содержимому
  • 404 Not Found - сервер не может найти запрашиваемый ресурс
  • 5хх - ошибка на стороне сервера
  • 500 Internal Server Error - сервер столкнулся с ситуацией, которую он не знает как обработать
  • 504 Gateway Timeout - сервер, работающий как gateway или proxy, не получил своевременный ответ от upstream-сервера

Первичные источники

  • RFC 9110: HTTP Semantics
  • RFC 9112: HTTP/1.1
  • RFC 9113: HTTP/2
  • RFC 9114: HTTP/3
  • RFC 5789: PATCH Method for HTTP