Введение в HTTP

Протокол передачи гипертекста — это набор правил для передачи данных через Интернет. Он был изобретен для стандартизации связи, например, как браузеры должны запрашивать данные у серверов и как серверы должны отвечать. HTTP очень широко распространен, поэтому как веб-разработчик вы будете часто взаимодействовать с этим протоколом.

Основной запрос

Это текстовый протокол, поэтому человек может легко его прочитать. Вот упрощенная версия сообщения, которое генерирует браузер, чтобы запросить главную страницу сайта dev.to:

GET / HTTP/1.1
Host: dev.to
User-Agent: Chrome/102.26.590.728
Accept-Language: en-US
Войти в полноэкранный режим Выйти из полноэкранного режима

Первая строка, называемая строкой запроса, содержит запрос. Мы сообщаем серверу, что хотим прочитать (GET) ресурс на корневой странице / (как в dev.to/). Строка заканчивается версией (1.1) протокола HTTP.

Заголовки

Вторая и последующие строки содержат дополнительную информацию, называемую заголовками. Это технические биты данных, необходимые для правильной работы коммуникации. Заголовок состоит из имени и значения, разделенных двоеточием. Одна строка содержит ровно один заголовок, и их количество не ограничено, за исключением максимального размера запроса, который может обработать сервер.

Заголовки необязательны, за исключением Host, который определяет домен запрашиваемого ресурса. Последние два заголовка в приведенном выше примере указывают наш браузер и предпочитаемый язык.

Полный список всех доступных заголовков длинный, и вам не обязательно знать их все. Кроме всего прочего, в большинстве случаев браузер будет обрабатывать их за вас.

Ответ

А вот как может выглядеть упрощенный ответ HTTP:

HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 31890
Content-Encoding: gzip
<response body>
Вход в полноэкранный режим Выйти из полноэкранного режима

Первая строка состоит из версии HTTP и кода состояния, который кратко описывает результат запроса. Как и в запросах, следующие строки содержат заголовки. Например, сервер сообщает нашему браузеру, что ответ содержит HTML-страницу (Content-Type: text/html).

HTTP-ответ может иметь тело ответа: файл (кучу байтов), HTML-страницу, или он может быть пустым. Вот что мы видим, когда наш браузер отображает эту информацию на экране.

Вот и все, что касается базовой схемы HTTP-сообщения.

Cookies

Cookies — это небольшие фрагменты информации, которые сохраняются при разных запросах. Они используются для «запоминания» пользователя на сайте. Например, информация о вашем входе в систему сохраняется в файлах cookie. Именно поэтому вы не проходите аутентификацию каждый раз, когда посещаете какой-либо сайт. По этой же причине вы видите целевую рекламу. Cookies хранятся в вашем браузере и отправляются на сервер с каждым запросом.

С точки зрения HTTP, файлы cookie — это заголовки. Изначально они отправляются вместе с ответом:

Set-Cookie: <cookie-name>=<cookie-value>
Войти в полноэкранный режим Выйти из полноэкранного режима

Если браузер сохранил файлы cookie, он будет передавать их при последующих запросах в виде заголовков:

Cookie: name=value
Войти в полноэкранный режим Выйти из полноэкранного режима

Методы

Методы или HTTP-глаголы описывают, какое действие мы хотим выполнить над ресурсом. Действие выполняется на стороне сервера, поэтому методы используются только в запросах. В стандарте определено 9 методов. Некоторые из них могут показаться одинаковыми, но есть 3 свойства, которые помогут нам определить разницу между ними:

  • Безопасность — действие только считывает ресурс и не изменяет его.
  • Идемпотентность — многократное выполнение одного и того же действия приведет к одному и тому же результату.
  • Кэшируемость — ответ может быть сохранен где-нибудь и извлечен для последующего использования.

Теперь давайте рассмотрим каждый метод. Я опущу CONNECT и TRACE, потому что они довольно редки.

ПОЛУЧИТЬ

Безопасность Идемпотентность Кэшируемость
+ + +

GET — наиболее часто используемый метод в интернете. Он используется для чтения ресурса. При навигации по сайту в браузере мы делаем запрос GET.

GET / HTTP/1.1
Host: httpbin.org
Вход в полноэкранный режим Выход из полноэкранного режима
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 9593
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>httpbin.org</title>
...
Вход в полноэкранный режим Выход из полноэкранного режима

ПОСТ

Безопасность Идемпотентность Кэшируемость
иногда

Метод POST отправляет данные на сервер. Эти данные помещаются в тело запроса, которое работает так же, как и в ответе HTTP. Метод POST изменяет состояние ресурса, часто создавая новый экземпляр чего-либо. Это второй наиболее часто используемый тип запроса в Интернете. Если вы отправляете форму на сайте, ваш браузер отправляет запрос POST.

POST /post HTTP/1.1
Host: httpbin.org
Content-Type: multipart/form-data; boundary=--------------------------878806948835616453637143
Content-Length: 285

----------------------------878806948835616453637143
Content-Disposition: form-data; name="login"
kazauwa
----------------------------878806948835616453637143
Content-Disposition: form-data; name="password"
supersecret
----------------------------878806948835616453637143–
Войти в полноэкранный режим Выход из полноэкранного режима

PUT

Безопасность Идемпотентность Кэшируемость
+

PUT подобен POST, но является идемпотентным. То есть, последующие запросы PUT приведут к тому же результату. POST, напротив, может привести к неожиданным последствиям. Представьте, что вы отправляете регистрационную форму несколько раз и создаете несколько одинаковых пользователей.

PATCH

Безопасность Идемпотентность Кэшируемость

Также известен как частичный PUT. В отличие от POST, его нельзя использовать в формах. PATCH предназначен для отправки только частичных изменений ресурса (скажем, мы хотим изменить только имя пользователя), но в реальности не многие серверы реализуют его.

DELETE

Безопасность Идемпотентность Возможность кэширования
+

DELETE используется для удаления ресурса. Разрешается отправлять данные в теле запроса, но это не обязательно. Как и в случае с PUT, он должен давать один и тот же результат при последующих запросах. В конце концов, вы не можете удалить что-то дважды.

Безопасность Идемпотентность Кэшируемость
+ + +

HEAD работает почти так же, как GET, за исключением того, что ответ не должен иметь тела. Если оно присутствует, то должно быть проигнорировано. HEAD используется для получения заголовков, которые могут быть использованы для планирования последующего запроса. Например, если мы хотим загрузить файл, будет неплохо проверить его размер (заголовок Content-Length) и посмотреть, можно ли его сохранить.

ВАРИАНТЫ

Безопасность Идемпотентность Кэшируемость
+ +

OPTIONS спрашивает у сервера, какие методы могут быть выполнены над ресурсом. Их можно найти внутри заголовка Allow в ответе. Вы, вероятно, не будете использовать его напрямую, но он иногда используется браузером. Не многие серверы реализуют этот метод.

OPTIONS / HTTP/1.1
Host: httpbin.org
Войти в полноэкранный режим Выход из полноэкранного режима
HTTP/1.1 200 OK
Allow: OPTIONS, HEAD, GET
Войти в полноэкранный режим Выход из полноэкранного режима

Коды состояния

Каждый ответ HTTP имеет код состояния — трехзначное число, которое указывает на то, был ли ответ успешным или нет. Они делятся на 5 групп:

  • 1хх — информационный
  • 2хх — успешный
  • 3хх — перенаправление
  • 4хх — ошибки клиента
  • 5хх — ошибки сервера

Давайте рассмотрим некоторые из распространенных кодов. Полный список можно найти здесь.

1хх

Информационные коды уведомляют клиента о промежуточном статусе его запроса. Скорее всего, вы их никогда не увидите.

2хх

Коды состояния из этой группы означают, что запрос был принят и успешно обработан сервером:

  • 200 OK — успех. Чаще всего вы будете видеть этот код состояния.
  • 201 Created — запрос привел к созданию нового ресурса. Обычно отправляется в ответ на запросы POST и PUT.
  • 202 Accepted — запрос принят, но еще не обработан. Например, операция занимает много времени и обрабатывается каким-то другим приложением, которое запускается раз в день.
  • 204 Нет содержимого — тело запроса пустое, но заголовки могут быть полезными. Вы можете увидеть его в ответ на запрос HEAD. Он также может использоваться с идемпотентными и небезопасными запросами, чтобы указать, что состояние не было изменено.

3xx

Эти коды указывают на то, что клиенту необходимо предпринять действия для завершения запроса.

  • 301 Moved Permanently — URL ресурса был изменен. Новый URL находится в ответе.
  • 302 Found — аналогичен предыдущему, за исключением того, что изменение носит временный характер. Например, поисковые системы не будут менять старый URL на новый в результатах.
  • 304 Not Modified — содержимое ресурса кэшировано и не изменилось с момента последнего запроса. Можно остановить текущий запрос на этом месте и использовать кэшированные данные.

4xx

Коды состояния из этой группы указывают на то, что в запросе была допущена ошибка:

  • 400 Bad Request — запрос неправильно сформирован, и сервер не может его обработать. Причин может быть много, но ошибка часто находится где-то в теле запроса.
  • 401 Unauthorized — для выполнения запроса требуется аутентификация.
  • 403 Forbidden — пользователь аутентифицирован, но не имеет права обращаться к ресурсу.
  • 404 Not Found — знаменитый код «страница не найдена». Указывает на то, что ресурс не существует. Некоторые сайты могут возвращать 404 вместо 403, чтобы скрыть существование некоторых страниц от неавторизованных пользователей.
  • 405 Method Not Allowed — ресурс не поддерживает метод запроса. Помните метод OPTIONS? Вы увидите этот код состояния, если запрашиваемый метод не входит в число тех, которые перечислены в заголовке Allow.
  • 429 Too Many Requests — от клиента поступило слишком много запросов, и они ограничиваются по скорости. Используется против DDoS и атак методом перебора.

5xx

Эти коды состояния указывают на то, что сервер столкнулся с ошибками при обработке запроса:

  • 500 Internal Server Error — необработанная ошибка на стороне сервера. Обычно происходит из-за ошибок в приложении.
  • 503 Service Unavailable — сервер не готов обработать запрос. В ответе может содержаться подсказка о том, когда он станет доступен.

Если у вас есть вопросы, не стесняйтесь задавать их в
комментариях.

Оцените статью
devanswers.ru
Добавить комментарий