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-протокола
- Клиент формирует и отправляет запрос на сервер по адресу (URL), который может быть введен в браузере или сгенерирован автоматически.
- Запрос передается по сети с помощью других протоколов, например TCP/IP, которые разбивают его на пакеты данных.
- Сервер получает запрос, обрабатывает его и отправляет ответ, который также передается по сети в виде пакетов данных.
- Клиент получает ответ и отображает результат, например веб-страницу в формате 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говорит о том, что клиент всё сделал правильно — проблема на стороне сервера.
-
Обычно при успешном выполнении операции сервер отвечает:
- на
GET—200 OK, - на
PUT—201 Created(если ресурс создан) или200 OK(ресурс обновлён), - на
DELETE—204 No Content(операция успешна, возвращать нечего), - на
POST—200 OKили201 Created(во втором случае в заголовке, обычноLocation, указывается URL созданного ресурса).
- на