HTTP - текстовый (в HTTP/1.1) протокол «запрос-ответ». Клиент отправляет запрос, сервер возвращает ответ. Соединение одно, но каждый запрос сам по себе: сервер не помнит предыдущие запросы, поэтому HTTP называют протоколом без состояния. Состояние добавляют поверх: куки, токены, сессии.
Из чего состоит запрос и ответ
POST /api/orders HTTP/1.1
Host: shop.example
Content-Type: application/json
Authorization: Bearer eyJhbGciOi...
Content-Length: 27
{"productId": 42, "qty": 1}
Стартовая строка (метод, путь, версия), заголовки, пустая строка, тело. Ответ устроен так же, только в первой строке версия и статус:
HTTP/1.1 201 Created
Location: /api/orders/981
Content-Type: application/json
{"id": 981, "status": "new"}
Методы
| Метод | Зачем | Безопасный | Идемпотентный |
|---|---|---|---|
| GET | получить ресурс | да | да |
| HEAD | как GET, но без тела | да | да |
| OPTIONS | узнать возможности (в том числе preflight CORS) | да | да |
| POST | создать, запустить действие | нет | нет |
| PUT | заменить ресурс целиком | нет | да |
| PATCH | частично изменить | нет | не гарантируется |
| DELETE | удалить | нет | да |
Безопасный метод не меняет состояние сервера (по смыслу, логи и счётчики не считаются). Идемпотентный значит: повторить запрос N раз - тот же эффект на сервере, что и один раз. Ответ при этом может отличаться: первый DELETE вернёт 204, второй 404, но ресурс в обоих случаях удалён.
Почему это важно: идемпотентные запросы можно безопасно повторять при обрыве сети. Браузер и прокси сами повторяют GET, но никогда не повторяют POST молча. Чтобы сделать POST безопасным для повтора (оплата!), используют заголовок Idempotency-Key.
Статусы
- 1xx информационные:
101 Switching Protocols(переход на WebSocket),103 Early Hints. - 2xx успех:
200 OK,201 Created(часто сLocation),204 No Content(тела нет). - 3xx перенаправление:
301и308навсегда,302и307временно,304 Not Modified(кеш актуален). Разница 307/308 и 301/302: первые гарантируют сохранение метода и тела, а с 301/302 браузеры исторически превращают POST в GET. - 4xx ошибка клиента:
400кривой запрос,401не аутентифицирован (кто ты?),403аутентифицирован, но нельзя,404нет ресурса,405метод не разрешён,409конфликт состояния,422данные синтаксически верны, но не проходят валидацию,429слишком много запросов. - 5xx ошибка сервера:
500внутренняя,502 Bad Gateway(прокси получил плохой ответ от бэкенда),503сервис недоступен,504 Gateway Timeout(прокси не дождался бэкенда).
Важные заголовки
Host- обязателен в HTTP/1.1: на одном IP живёт много сайтов.Content-Type- формат тела (application/json,multipart/form-data).Accept- что клиент готов принять.Content-LengthилиTransfer-Encoding: chunked- как понять, где кончается тело.CookieиSet-Cookie- куки;Authorization- учётные данные.Cache-Control,ETag,If-None-Match- кеширование.Origin,Access-Control-*- CORS.Location- куда идти при 3xx или где созданный ресурс при 201.
Частые ошибки
- Путать 401 и 403. 401 значит «представься», 403 значит «я тебя знаю, но нельзя».
- Отдавать
200с{"error": ...}в теле. Клиенты, мониторинг и ретраи опираются на статус. - Менять данные в GET. Ссылку может открыть краулер или prefetch браузера.
- Считать PATCH идемпотентным всегда.
{"op":"increment"}повторять нельзя.
Что спросят на собесе
- Чем отличаются GET и POST, кроме «тело есть или нет»?
- Что такое идемпотентность, какие методы идемпотентны и зачем это знать?
- Разница 401 и 403, 502 и 504, 301 и 308.
- Зачем заголовок
Host? - Почему HTTP называют stateless и как тогда работают сессии?