HTTP (Hyper Text Transfer Protocol) – широко распространённый протокол передачи данных, изначально предназначенный для передачи гипертекстовых документов. По умолчанию используется 80-ый порт.
HTTPS (Hyper Text Transfer Protocol Secure)— безопасный протокол передачи гипертекста. Это расширение протокола HTTP, поддерживающее шифрование посредством криптографических протоколов SSL и TLS. По умолчанию используется 443-ий порт.
Спецификация HTTP (и HTTPS) определяет то, как запросы к серверу должны быть построены, и то, как сервер должен отвечать на эти запросы.
Основные свойства HTTP:
- Не зависит от соединения. Для отправки запроса клиент устанавливает соединение с сервером и отсоединяется после отправки запроса. Сервер, в свою очередь, обрабатывает запрос и устанавливает соединение с клиентом для отправки ответа и отсоединяется после нее. Ни клиент, ни сервер не «знают» ничего о состоянии друг друга до начала соединения и после его окончания.
- Не привязан к конкретному типу данных. Можно передавать любой тип данных при условии, что и клиент, и сервер способен работать с выбранным типом данных.
- Взаимодействует только через соединение. Клиент и сервер могут взаимодействовать друг с другом только с помощью запроса. Из-за этой особенности ни клиент, ни сервер не могут получить информацию за пределами запроса.
Запросы HTTP
Клиент отправляет запрос на сервер в виде метода, URL и версии протокола, после которого идет некоторое сообщение, которое и содержит данные запроса.

Разберем подробнее каждую из частей запроса.
Method (метод) — это действие, которое мы хотим произвести над ресурсом на сервере. Их достаточно большое количество, но выделим основные 4:
- GET — предназначен для получения ресурса с сервера;
- POST — отправляет данные на сервер с созданием новой записи;
- PUT — отправляет данные на сервер с перезаписью существующей записи;
- DELETE — удаляет данные ресурса.
GET | POST | PUT | DELETE |
---|---|---|---|
Только получает данные ресурса | Может получать и отправлять данные ресурса | Перезаписывает существующий ресурс | Удаляет указанный ресурс |
Передает данные в URL | Передает данные в теле запроса | Передает данные в теле запроса | Данные могут передаваться в теле и в URL запроса |
Имеет ограничение на длину 255 символов | Нет ограничений по длине | Нет ограничений по длине | Нет ограничений по длине |
Можно использовать только символы ASCII | Можно использовать символы любой кодировки и передавать файлы | Можно использовать символы любой кодировки и передавать файлы | Можно использовать только символы ASCII |
Не безопасен (нельзя передавать пароли) | Более безопасен | Более безопасен | Не безопасен |
Request URI — строка запроса, которая содержит последовательность символов к ресурсу, а также (опционально) параметры запроса, которые могут передаваться прямо в строке запроса (например, для GET).
Для передачи параметров в строке запроса необходимо следовать ряду определенных правил:
- Параметры отделяются от адреса символом «?».
- Каждый параметр задается парой «Ключ» и «Значение».
- «Ключ» и «Значение» разделены между собой символом «=».
- При необходимости задать несколько параметров в одной строке запроса, они отделяются друг от друга символом «&».
Например, в строке запроса http://example.com/path/to/page?name=ferret&color=purple:
- http://example.com/ — базовый адрес (base URL), с которого будут начинаться все запросы;
- /path/to/page — путь к ресурсу относительно базового адреса;
- Параметр name со значением ferret;
- Параметр color со значением purple.
Стоит отметить, что данные в строке запроса должны передаваться в специальной кодировке — URL Percent Encoding. Таким образом, чтобы передать в строке запроса, например, символы кириллицы, необходимо перевести их в этот формат. В сети существует множество инструментов, позволяющих легко перевести строку запроса в нужный формат.
Protocol version — версия протокола HTTP (практически всегда используется HTTP/1.1).
Headers (заголовки или «хедеры») — часть запроса, в которой хранится необходимая для выполнения запроса информация от клиента.
Заголовки представляют пары «Ключ»:»Значение». Они содержат различную информацию о HTTP-запросе и Вашем браузере. Например, строка «User-Agent» предоставляет информацию о версии браузера и операционной системе, которую Вы используете. «Accept-Encoding» сообщает серверу, может ли Ваш браузер принимать сжатый output, например, gzip.
В свою очередь, ответ сервера так же содержат заголовки. Эти значения могут содержать информацию о софте сервера при последнем изменении страницы/файла и прочее. Опять же, большинство этих headers на самом деле являются необязательными.
Кроме этого, сервер отправляет так же код состояния (statuscode) ответа. Коды состояния делятся на 5 групп:
1хх | Информационные |
---|---|
2хх | Успешные |
3хх | Перенаправление |
4хх | Ошибки клиента |
5хх | Ошибки сервера |
Полный список кодов ошибок из каждой группы и их описание можно посмотреть тут.
Body (тело запроса) — опциональное поле, в котором передается вся необходимая информация, которую нужно передать на сервер.
Рассмотрим выполнение запросов на примерах.
Общим предусловием для всех примеров будет наличие сайта https://reqres.in, который позволяет производить различного рода действия над пользователем. В данном случае, https://reqres.in — это базовый адрес (base URL), к которому будут добавляться пути к ресурсам.
GET запрос. Имеет функцию получения списка пользователей. Задача данной функции — отображать список пользователей по три записи на странице.
GET /api/users?page={page_number}
Получим список пользователей для второй страницы:

Как мы видим, в поле ниже мы получили ответ в формате JSON, который содержит 3 записи о пользователях.
POST запрос. Функция используется для входа в приложение и возвращает ответ со значением токена авторизации.
POST /api/login
Параметры тела запроса:
- email – новое имя пользователя;
- password – новая профессия пользователя.
Вызов функции и ответ сервера будет выглядеть таким образом:

В данном примере строка запроса не содержит параметров. Body запроса же в свою очередь содержит два параметра — email и password. Ответ функции содержит Body с токеном авторизации пользователя.
PUT запрос. Функция изменения данных пользователя. Возвращает ответ с измененными данными пользователя и датой изменения.
PUT /api/users/{user_id}
Параметры тела запроса:
- name – новое имя пользователя;
- job – новая профессия пользователя.
Подставив параметры в URI и тело запроса, получим:

DELETE запрос. Функция удаления данных пользователя. Функция возвращает пустой ответ и код 204 (No Content)
DELETE /api/users/{user_id}
Тело запроса не содержит данных.
Подставив нужный идентификатор пользователя в строку запроса, удалим его данные:
