HTTP-запрос

Чтобы в Интернете что-то от кого-то получить, нужно сделать запрос. В частности, в вебе это HTTP-запросы.

Пробежимся по основным понятиям, рассмотрим структуру и соберём свой HTTP-запрос.

HTTP

HyperText Transfer Protocol — протокол передачи гипертекста (текста со ссылками на другие такие тексты), то есть набор правил, по которым:

Структура HTTP-запроса

Запрос — это текст со строгой структурой. Простой пример, который дальше разберём:

GET /images/landscape.png HTTP/1.1
Host: eleday.ru
User-Agent: Chrome
Accept: image/*

1. Строка запроса

GET /images/landscape.png HTTP/1.1

Здесь три элемента:

Метод GET
Путь /images/landscape.png
Версия протокола HTTP/1.1

Методы бывают:

GET Получить данные
POST Отправить
PUT Заменить полностью
DELETE Удалить
PATCH Изменить частично
HEAD Получить заголовки

и другие. На практике чаще всего используются первые два

Путь

— адрес, который указывает на ресурс, который нужно получить

Версии:

HTTP/1.0 Базовая версия протокола. Каждый запрос открывает отдельное соединение с сервером.
HTTP/1.1 Добавлены постоянные соединения (keep-alive), заголовок Host и более эффективная работа с несколькими запросами.
HTTP/2 Бинарный протокол с мультиплексированием: несколько запросов могут передаваться одновременно по одному соединению.
HTTP/3 Работает поверх протокола QUIC (UDP). Быстрее устанавливает соединение и лучше справляется с потерей пакетов.

2. Заголовки

Дополнительные параметры запроса в формате: Заголовок: значение

Для нашего запроса это:

Host: eleday.ru Указывает доменное имя сервера
User-Agent: Chrome Информация о клиентском приложении (браузере), операционной системе и устройстве
Accept: image/* Типы данных, которые клиент может обрабатывать

Ещё популярные заголовки:

Content-Type Тип передаваемых данных
Authorization Авторизационные данные
Cookie Куки пользователя
Referer Страница, с которой пришёл запрос

3. Тело запроса

Иногда у HTTP-запроса есть тело (body), например, в запросах с методами POST, PUT, PATCH. Тело используется, когда клиент отправляет данные серверу.

POST /login HTTP/1.1
Host: example.com
Content-Type: application/json

{
  "login": "vasya",
  "password": "123456"
}

Ответ

В таком виде запрос отправляется на сервер:

GET /hello HTTP/1.1
Host: eleday.ru

А сервер присылает ответ:

HTTP/1.1 200 OK
Content-Type: application/octet-stream
Content-Length: 12

hello world!

Тут тоже есть заголовки и тело ответа

URL-параметры

У GET-запросов нет тела, в котором можно было бы передать дополнительные данные, но иногда они нужны, например, в поисковых запросах.

В таких случаях используются URL-параметры, которые передаются прямо в пути после знака вопроса в формате ключ1=значение1&ключ2=значение2&...

Например:

/search?q=http-запрос&sort=recent

Собери свой HTTP-запрос

Теперь попробуй собрать запрос прямо здесь: выбери метод, введи URL, заголовки и получи итоговый HTTP-запрос в текстовом виде.

Формат: Header-Name: value (каждая пара на новой строке)