Запрос и ответ: из чего состоит HTTP-сообщение

↑ 1.2 HTTP и REST для не-разработчиков · → Следующая

Обязательно~7 мин чтенияУровень: junior

Зачем это аналитику и PM

Жалоба «не сохранилось» почти всегда упирается в конкретное сообщение: что ушло на сервер и что вернулось. Пока запрос не разобран на части, пустой экран легко спутать с отказом в правиле или со сбоем сети.

План темы

  • стартовая строка
  • заголовки
  • тело
  • пример реального запроса и ответа

Объяснение

HTTP-сообщение — это запрос или ответ по протоколу HTTP (Hypertext Transfer Protocol, протокол передачи гипертекста): стартовая строка, заголовки и необязательное тело. Этим языком говорят браузер, мобильное приложение и почти любой веб-API.

Как бланк в окошке. Первая строка говорит, что вы просите или чем дело кончилось. Штампы на полях — заголовки: формат, допуск, размер. Лист внутри — тело с данными задачи. Пустая строка отделяет штампы от листа. Без неё получатель не понимает, где кончились служебные поля.

Стартовая строка

У запроса в ней три куска: метод, путь и версия протокола. Метод — операция, путь — какой ресурс, версия — по каким правилам читать дальше.

GET /orders/1042 HTTP/1.1

У ответа вместо метода стоят версия, трёхзначный код и короткая причина. Решение принимают по коду. Слова OK или Not Found — подпись для человека, не отдельный контракт. В HTTP/2 и HTTP/3 ту же тройку возят в двоичном виде. Во вкладке сети вы всё равно видите метод, путь и код: инструменты показывают их текстом.

Заголовки

Дальше идут строки Имя: значение, каждая с новой строки. Здесь лежат тип тела, какой ответ клиент готов принять, и допуск. Регистр имени обычно не важен, но в переписке лучше копировать заголовок как в примере команды. Смысл частых полей разобран в теме про заголовки. Пока достаточно видеть границу: заголовок — не поле заказа, а служебная пометка к сообщению.

Тело

Тело есть не всегда. «Покажи заказ» часто уходит без тела, ответ со списком почти всегда с телом. Пустая строка перед телом обязательна и тогда, когда тела нет: она закрывает список заголовков. В баге пишите отдельно, о каком теле речь. Тело запроса — то, что отправили. Тело ответа — то, что вернулось. Их путают, когда в обоих есть JSON с полем status.

sequenceDiagram
    participant C as Клиент
    participant S as Сервер
    C->>S: Стартовая строка и заголовки
    C->>S: Пустая строка и тело если оно есть
    S-->>C: Код ответа и заголовки
    S-->>C: Тело ответа если оно есть
ЧастьВ запросеВ ответе
СтартМетод, путь, версияВерсия, код, короткая причина
ЗаголовкиТип, допуск, какой ответ ждутТип тела, размер, служебные пометки
ТелоДанные действия, часто JSONЗаказ, список или текст ошибки

Примеры

Ниже схема сообщения на учебном домене example.com, не снимок вашего боя. Токен закрыт маской.

POST /orders HTTP/1.1
Host: api.example.com
Content-Type: application/json
Authorization: Bearer eyJ...
 
{"sku": "MUG-1", "qty": 2}

Ответ на создание часто выглядит так. Это схема: код 201 команда может заменить своим правилом.

HTTP/1.1 201 Created
Content-Type: application/json
 
{"orderId": "1042", "status": "created"}

Живой обмен без ключа даёт учебный JSONPlaceholder. Команда только читает заранее заготовленную запись. Разберите в ответе стартовый код, заголовок типа и тело.

curl -sS -D - "https://jsonplaceholder.typicode.com/todos/1" -o /tmp/todo.json

Типичное тело этого метода:

{
  "userId": 1,
  "id": 1,
  "title": "delectus aut autem",
  "completed": false
}

Нюансы и подводные камни

  • Код успеха и текст ошибки в теле иногда приходят вместе. Читайте оба слоя, не выбирайте один.
  • В HTTP/1.1 заголовок Host обязателен. Без него сервер имеет право ответить отказом ещё до ваших полей.
  • Красивый перенос в редакторе — не конец строки протокола. В сыром HTTP/1.1 строки заканчиваются парой «возврат каретки и перевод строки».

Практика

На тестовом стенде или на JSONPlaceholder откройте один запрос во вкладке сети. Выпишите стартовую строку запроса, код ответа, один заголовок и есть ли тело.

Ожидаемый результат: четыре строки, например метод GET, путь /todos/1, код 200, заголовок content-type и пометка «тело есть». Секрета в выписке нет.

Вопросы с ответами

Связано с блоком Developer

Связанные темы