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