Перейти к основному содержимому

HTTP. Что нужно знать аналитику

HTTP (HyperText Transfer Protocol) — это, если дословно, протокол передачи гипертекста. Простыми словами, гипертекст – это текст + теги. Сегодня HTTP – самый популярный протокол интернета и в целом интеграций через API.

Через протокол можно передавать любые данные. Протокол есть набор правил, определяющих, как обмениваться данными. Благодаря своей простоте и гибкости, HTTP используется практически повсеместно при проектировании API систем и сервисов.

Основой HTTP является технология «клиент-сервер», есть две роли: сервер и клиент.

  • Клиент инициирует соединение и посылает запрос на сервер.
  • Сервер обрабатывает запрос и посылает ответ клиенту.

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

Структура HTTP-сообщения всегда одинакова:

  • Стартовая строка, в которой определяется адрес, по которому отправляется запрос, и тип сообщения. Указывается метод, который определяет действия при получении этого сообщения (GET, POST и т.д.)
  • Заголовки (Headers), в которых прописаны определённые параметры сообщения. Например, может быть напрямую задан язык.
  • Тело запроса (Request Body), текст сообщения — данные, которые передаются. Например, файлы, отправляемые на сервер.

Пример запроса:

GET /users/octocat HTTP/1.1
Host: api.github.com
User-Agent: curl/7.64.1
Accept: */*

Процесс работы HTTP-протокола

  1. Клиент формирует и отправляет запрос на сервер по адресу (URL), который может быть введен в браузере или сгенерирован автоматически.
  2. Запрос передается по сети с помощью других протоколов, например TCP/IP, которые разбивают его на пакеты данных.
  3. Сервер получает запрос, обрабатывает его и отправляет ответ, который также передается по сети в виде пакетов данных.
  4. Клиент получает ответ и отображает результат, например веб-страницу в формате HTML.

Структура ответа в HTTP

Ответ в HTTP состоит из тех же частей, что и запрос:

  • Стартовая строка содержит версию протокола, код состояния и текст результата запроса, например, HTTP/1.1 200 OK.
  • Заголовки содержат дополнительную информацию о ответе, такую как тип и длина контента, дата и время, куки, кэширование и т.д. Пример:
    Content-Type: text/html; charset=utf-8
    Content-Length: 125829
    Date: Mon, 29 Nov 2021 10:24:06 GMT
  • Тело содержит данные ответа, например HTML-документ, изображение, JSON-объект и т.д.

Пример ответа:

HTTP/1.1 200 OK
Date: Sat, 09 Oct 2010 14:28:02 GMT
Server: Apache
Content-Length: 29769
Content-Type: text/json

{
"isFree": false,
"price": 200
}

Основные рекомендации

URL и методы

  • URL идентифицирует ресурс. Вызов метода — не ресурс.

    • Не делайте так: GET /?method=шарахнуть&to=Луна
    • Лучше так: POST /шарахалка/?to=Луна
  • URL состоит из схемы, хоста, пути, запроса и фрагмента.

    • Путь — для иерархических ресурсов, запрос — для неиерархических и параметров операции. Фрагмент — для подчинённых ресурсов без URL.

    Например, если у вас есть каталог котиков по породам, то породы — часть пути, города доставки — часть запроса, фрагмент – это якорь на странице: http://nyashnye-kotiki.xxx/breeds/maine-coon/?deliver_to=Moscow#photo

  • Обращение по HTTP — это применение метода (глагола) к URL. Результат должен соответствовать глаголу.

    • Например, GET возвращает ресурс, DELETE удаляет его.

Безопасные и кэшируемые методы

  • Методы GET, HEAD, OPTIONS — безопасные. Они не изменяют состояние ресурса. Некоторые сетевые агенты могут вызывать их без вашего согласия.
  • Методы GET и HEAD кэшируются по умолчанию, остальные — нет.
    • Если вы хотите "шарахнуть" по Луне методом GET, то можете получить ответ из кэша и не "шарахнуть" на самом деле.

Идемпотентность методов

  • Методы GET, PUT, DELETE идемпотентны.

    • PUT кладёт ресурс по URL-у, GET возвращает его, DELETE удаляет его.
    • Метод HEAD возвращает только заголовки ресурса.
  • POST используется, если у вас нет URL для операции.

    • Например, если вы создаёте новое сообщение на форуме и не можете самостоятельно сгенерировать его ID.
    • POST /threads/php-rulezz/messages

    Если вы повторите POST запрос — создастся дубликат сообщения. PUT можно повторять сколько угодно — результат не изменится. Это свойство называется идемпотентностью. Если клиент сам может сгенерировать ID, лучше использовать PUT: PUT /threads/php-rulezz/messages/100500

Обновление и частичное изменение ресурсов

  • PUT может создавать или обновлять ресурсы целиком. PATCH может модифицировать ресурсы частично.

Коды ответа

  • Коды ответа нужны, чтобы клиент мог понять, что ему делать дальше.

    • 3xx говорит, что нужно выполнить дополнительное действие.
    • 4xx говорит, что клиент сделал что-то неправильно. В 4xx крайне рекомендуется включать информацию о том, что конкретно клиент сделал не так.
    • 5xx говорит о том, что клиент всё сделал правильно — проблема на стороне сервера.
  • Обычно при успешном выполнении операции сервер отвечает:

    • на GET200 OK,
    • на PUT201 Created (если ресурс создан) или 200 OK (ресурс обновлён),
    • на DELETE204 No Content (операция успешна, возвращать нечего),
    • на POST200 OK или 201 Created (во втором случае в заголовке, обычно Location, указывается URL созданного ресурса).

Работа с HTTP-статусами

  • 401 Unauthorized обязан сопровождаться заголовком WWW-Authenticate и подходит только для HTTP-аутентификации. Используйте 403 Forbidden для других случаев.
  • 3xx статусы требуют дополнительного действия от клиента.
    • Например, 304 Not Modified означает, что клиент должен взять ресурс из кэша.
  • 404 статус может повторяться, так как ресурс может появиться позже.
    • Если ресурса нет и не будет, используйте 410 Gone или 400 Bad Request.

Подборка материалов по теме

  1. Стандарт HTTP 1.1 — RFC 2616
  2. Что такое протокол HTTP и почему на нём работают почти все сайты
  3. Статья на сайте Backend interview
  4. Обзор протокола HTTP — Mozilla
  5. HTTP-запросы: структура, методы, строка статуса и коды состояния — Академия Selectel
  6. Самые распространённые HTTP-заголовки
  7. 15 тривиальных фактов о правильной работе с протоколом HTTP — Хабр, Яндекс
  8. REST API Best Practices — Хабр
  9. Best Practices in API Design — блог Swagger