Запрос и ответ: вся суть в двух сообщениях
HTTP, HyperText Transfer Protocol, описывает разговор между клиентом и сервером в формате «вопрос — ответ». Клиент, чаще всего браузер, отправляет запрос, сервер возвращает ответ, после чего обмен по этой паре считается завершённым. Сервер сам не помнит, что вы просили минуту назад: протокол по своей природе не хранит состояния, и всё, что похоже на «вы вошли в аккаунт», держится на дополнительных механизмах вроде cookie и токенов.
Запрос состоит из стартовой строки, набора заголовков и, если нужно, тела. В стартовой строке указаны метод, путь к ресурсу и версия протокола. Ответ устроен зеркально: строка со статусом, заголовки и тело, в котором лежит страница, картинка или данные в формате JSON. Само сообщение в версиях 1.x читается человеком как обычный текст, поэтому HTTP так удобно отлаживать.
Методы: что именно клиент просит сделать
Метод сообщает серверу намерение. GET просит отдать ресурс и не должен ничего менять на сервере. POST отправляет данные на обработку, например форму или новый комментарий. PUT заменяет ресурс целиком, PATCH меняет его частично, DELETE удаляет. HEAD работает как GET, но возвращает только заголовки, без тела, а OPTIONS спрашивает, какие методы сервер вообще разрешает для данного адреса.
Важны два свойства. Безопасные методы, к которым относятся GET, HEAD и OPTIONS, по замыслу ничего не меняют. Идемпотентные методы, то есть GET, PUT и DELETE, при повторе дают тот же итог, что и при одном вызове. POST под это определение не подпадает, поэтому повторная отправка формы иногда создаёт дубль заказа, а браузер перед этим и переспрашивает, точно ли вы хотите повторить действие.
Отдельного внимания заслуживает и заголовок ответа Allow вместе с кодом 405: если вы отправили метод, который для адреса не предусмотрен, сервер отвечает именно так и перечисляет допустимые варианты. Для разработчиков API это привычный способ понять, в чём ошибка.
Заголовки: служебная информация вокруг данных
Заголовки — это пары «имя: значение», которые уточняют смысл сообщения. Host называет сайт, к которому обращаются: благодаря ему на одном IP-адресе живут сотни сайтов. Content-Type говорит, что лежит в теле: html, json или изображение. Accept-Language сообщает предпочитаемые языки, Cache-Control задаёт правила кеширования, Set-Cookie просит браузер запомнить небольшой фрагмент данных, а Location сопровождает перенаправление.
Часть заголовков влияет на безопасность. Strict-Transport-Security закрепляет за сайтом работу только по шифрованному каналу, Content-Security-Policy ограничивает, откуда страница может подгружать скрипты. Заголовок User-Agent рассказывает о программе клиента, а Referer, который пишется с исторической опечаткой, сообщает, с какой страницы пришёл переход. Обо всех этих полях по отдельности можно прочитать на страницах про user-agent и заголовок Referer.
Коды статусов: как читать ответ сервера
Первая цифра кода задаёт класс. Коды 1xx информационные, 2xx означают успех, 3xx — перенаправление, 4xx — ошибку на стороне клиента, 5xx — ошибку на стороне сервера. Самый частый из успешных — 200 OK, 201 Created сообщает о создании ресурса, 204 No Content — что ответ успешен, но тела нет.
Среди перенаправлений различают 301, постоянный переезд, и 302 либо 307, временный. Из ошибок клиента чаще всего встречаются 400 (запрос сформирован неверно), 401 (нужна аутентификация), 403 (доступ запрещён, хотя вас узнали), 404 (ресурс не найден) и 429 (слишком много запросов). Из серверных — 500 (внутренняя ошибка), 502 и 504, которые обычно возникают, когда прокси или балансировщик не дождался ответа от сервера за ним, и 503, когда сервис временно недоступен. Читая код, вы сразу понимаете, по какую сторону соединения искать причину.
Распространённые заблуждения и как всё увидеть самому
Первое заблуждение: HTTP и HTTPS — разные протоколы. На деле HTTPS — тот же HTTP, только передаваемый внутри TLS-соединения, поэтому содержимое запросов и ответов шифруется. Второе: методом POST данные «спрятаны». Тело запроса не показывается в адресной строке, но без шифрования любой промежуточный узел прочитает его так же легко. Третье: код 404 всегда означает удалённую страницу; иногда так сервер намеренно отвечает и на запросы к скрытым ресурсам.
Посмотреть обмен можно без сторонних программ. Откройте инструменты разработчика в браузере, вкладку «Сеть», обновите страницу и щёлкните по любой строке: справа будут видны метод, код статуса, заголовки запроса и ответа. В терминале то же покажет утилита curl с ключом -I, которая запрашивает только заголовки.