Структура сообщений HTTP

HTTP-сообщение состоит из трёх частей, только первая из которых является обязательной.

  • Стартовая строка
  • Заголовки
  • Тело сообщения

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

Стартовые строки HTTP-запроса и ответа выглядят по-разному.

HTTP-Запрос

METHOD URI HTTP_VERSION

Метод определяет, какое действие клиент хочет совершить: получить данные, создать объект, обновить его, удалить. URI - идентификатор ресурса, куда клиент обращается или иными словами путь к ресурсу/документу. HTTP_VERSION - соответственно версия HTTP. На сегодняшний день для REST это всегда 1.1.

Пример:
GET /api/dcim/devices/1/ HTTP/1.1

HTTP-Ответ

HTTP_VERSION STATUS_CODE REASON_PHRASE
HTTP_VERSION - версия HTTP (1.1).
STATUS_CODE - три цифры кода состояния (200, 404, 502 итд)
REASON_PHRASE - Пояснение (OK, NOT FOUND, BAD GATEWAY итд)
Пример:
HTTP/1.1 200 OK

Заголовки

В заголовках передаются параметры данной HTTP-транзакции.

Например, в примере выше в HTTP-запросе это были:

Host: netbox.linkmeup.ru:45127
User-Agent: curl/7.54.0
Accept: application/json; indent=4

В них указано, что

  • Обращаемся к хосту netbox.linkmeup.ru:45127,
  • Запрос был сгенерирован в curl,
  • А принимаем данные в формате JSON с отступом 4.

А вот какие заголовки были в HTTP-ответе:

Server: nginx/1.14.0 (Ubuntu)
Date: Tue, 21 Jan 2020 15:14:22 GMT
Content-Type: application/json
Content-Length: 1638
Connection: keep-alive

В них указано, что

  • Тип сервера: nginx на Ubuntu,
  • Время формирования ответа,
  • Формат данных в ответе: JSON
  • Длина данных в ответе: 1638 байтов
  • Соединение не нужно закрывать - ещё будут данные.

Заголовки, как вы уже заметили, выглядят как пары имя:значение, разделённые знаком «:».

Полный список возможных заголовков.

Тело HTTP-сообщения

Тело используется для передачи собственно данных. В HTTP-ответе это может быть HTML-страничка, или в нашем случае JSON-объект.

Между заголовками и телом должна быть как минимум одна пустая строка.

При использовании метода GET в HTTP-запросе обычно никакого тела нет, потому что передавать нечего. Но тело есть в HTTP-ответе. А вот например, при POST уже и в запросе будет тело. Давайте о методах и поговорим теперь.