Запрос и ответ
HTTP — текстовый протокол «запрос — ответ». Запрос состоит из метода, пути, заголовков и необязательного тела:
POST /api/orders HTTP/1.1
Host: shop.example.ru
Content-Type: application/json
Authorization: Bearer eyJ...
{"productId": 42, "count": 2}
Ответ — код статуса, заголовки и тело.
Методы
| Метод | Что делает | Идемпотентен |
|---|---|---|
| GET | получить | да |
| POST | создать или отправить | нет |
| PUT | заменить целиком | да |
| PATCH | изменить частично | не обязательно |
| DELETE | удалить | да |
GET передаёт параметры в URL и не должен менять данные. Идемпотентный метод при повторе даёт тот же эффект, что и один вызов. Отсюда важный тест: двойной клик по кнопке «Оформить» не должен создавать два заказа — POST сам по себе от этого не защищает.
Коды ответа
| Группа | Смысл | Частые |
|---|---|---|
| 2xx | успех | 200, 201 Created, 204 No Content |
| 3xx | перенаправление | 301, 302, 304 Not Modified |
| 4xx | ошибка клиента | 400, 401, 403, 404, 409, 422, 429 |
| 5xx | ошибка сервера | 500, 502, 503, 504 |
401 — не аутентифицирован: «кто вы?». 403 — известно, кто вы, но нельзя. 4xx подсказывает, что проблема в запросе, 5xx — на сервере. Это первое, что смотрят в DevTools на вкладке Network, когда ищут, на чьей стороне ошибка.
REST
REST — стиль проектирования API поверх HTTP: ресурсы адресуются URL, действия выражаются методами, сервер не хранит состояние клиента между запросами.
GET /orders/42 — получить заказ
POST /orders — создать
DELETE /orders/42 — удалить
В пути — существительные: /orders/42, а не /getOrder?id=42. Коды ответа и заголовки кэширования несут смысл, а не просто «200 и текст ошибки в теле».
Версии HTTP
- HTTP/1.1 — текст, один запрос за раз в соединении. Чтобы распараллелить загрузку, браузер открывает около шести соединений на домен.
- HTTP/2 — бинарные кадры и много потоков в одном TCP-соединении, сжатие заголовков. Блокировка на уровне HTTP ушла, но осталась на уровне TCP: потеря одного пакета задерживает все потоки.
- HTTP/3 — то же поверх QUIC (UDP): потеря пакета задерживает только свой поток, TLS 1.3 встроен, соединение переживает смену сети.
Методы, коды и заголовки во всех версиях одинаковы.
HTTPS
HTTPS — HTTP поверх TLS. TLS даёт три вещи: шифрование, целостность и подлинность сервера. В рукопожатии стороны договариваются об общем ключе, а сервер доказывает владение сертификатом. Браузер проверяет цепочку сертификата до доверенного корневого центра и совпадение имени домена. Дальше данные шифруются быстрым симметричным шифром: асимметрия нужна, чтобы договориться о ключе, симметрия — чтобы быстро шифровать.
TLS 1.3 тратит на рукопожатие один оборот, а при повторном подключении — ноль.
Что запомнить
- GET читает, POST создаёт; PUT и DELETE идемпотентны, POST — нет.
- 4xx — проблема в запросе, 5xx — на сервере; 401 и 403 — разное.
- REST — ресурсы в URL, действия в методах.
- HTTP/2 — много потоков в одном соединении, HTTP/3 — поверх QUIC.
- HTTPS — шифрование, целостность и подлинность сервера.