HTTP: методы, статусы, заголовки
Язык браузера и сервера, HTTP-кэширование и что значит «идемпотентный».
Обновлено
Что такое HTTP
HTTP — язык, на котором общаются браузер и сервер. HTTP-сообщение — это текст из трёх частей: стартовая строка, заголовки (метаданные) и, при необходимости, тело (содержимое).
GET /api/posts?page=2 HTTP/1.1 ← метод + путь
Host: learn-js.vercel.app ← заголовки
Accept: application/json
Cookie: vid=9e88...
HTTP/1.1 200 OK ← статус
Content-Type: application/json
Cache-Control: max-age=60
[{"id":1,"title":"Привет"}] ← тело
HTTP не хранит состояние (stateless) — каждый запрос независим, сервер ничего «не помнит» между ними. Поэтому существуют cookie.
Методы
| Метод | Роль | Есть тело | Идемпотентный |
|---|---|---|---|
GET |
чтение | нет | да |
POST |
создание / действие | да | нет |
PUT |
полная замена | да | да |
PATCH |
частичное изменение | да | обычно нет |
DELETE |
удаление | редко | да |
Идемпотентность — если повторить запрос 5 раз, результат будет таким же, как после одного. GET никогда не должен менять данные — браузеры и поисковые роботы могут повторять его в любой момент.
Коды статуса
| Класс | Значение | Самые частые |
|---|---|---|
2xx |
успех | 200 OK, 201 Created, 204 No Content |
3xx |
перенаправление | 301 постоянное, 302/307 временное, 304 Not Modified |
4xx |
ошибка клиента | 400 неверные данные, 401 не аутентифицирован, 403 запрещено, 404 не найдено, 429 слишком много запросов |
5xx |
ошибка сервера | 500 внутренняя ошибка, 502/503 сервис недоступен |
401 и 403: 401 = «я не знаю, кто вы», 403 = «я знаю, кто вы, но вам нельзя».
Важные заголовки
| Заголовок | Направление | Роль |
|---|---|---|
Content-Type |
оба | формат тела: application/json, text/html |
Authorization |
запрос | токен доступа |
Cookie / Set-Cookie |
запрос / ответ | cookie |
Cache-Control |
ответ | сколько можно хранить в кэше |
Location |
ответ | куда ведёт 3xx-редирект |
HTTP-кэширование
Cache-Control сообщает браузеру и CDN, сколько можно повторно использовать ответ, не запрашивая его снова:
| Значение | Эффект |
|---|---|
max-age=3600 |
свежий 1 час |
no-cache |
можно хранить, но перед использованием проверить на сервере |
no-store |
не хранить вообще (чувствительные данные) |
public / private |
может хранить CDN / только браузер |
stale-while-revalidate=60 |
отдать устаревшую версию, обновить в фоне |
Последнее — ровно та идея, что стоит за revalidateTag(tag, 'max') в Next.
HTTP/1.1, HTTP/2, HTTP/3
Та же семантика (методы, статусы, заголовки), более эффективный транспорт: HTTP/2 передаёт много файлов по одному соединению; HTTP/3 работает поверх QUIC (лучше в мобильных сетях). Для фронтенд-разработчика код остаётся прежним.
Частые ошибки
- Менять данные через
GET(ссылки вида/delete?id=5). - Возвращать
200с{ error: '...' }вместо правильного статуса. - Кэшировать приватные ответы (
publicдля данных пользователя).
Коротко
- Запрос = метод + URL + заголовки + тело; ответ = статус + заголовки + тело.
- GET читает, POST создаёт, PUT/PATCH изменяют, DELETE удаляет.
- 4xx — вина клиента, 5xx — вина сервера.
Cache-Controlрешает, сколько ответ живёт в кэше.