И снова поговорим об HTTP :)

В интернете есть тысячи статей, видео, курсов, о том, что такое HTTP, как работает и т.п. Я бы не хотел снова описывать “что такое HTTP, чем GET отличается от POST” и расскажу о некоторых не самых очевидных вещах для типичных тестировщиков. За свою карьеру я прособеседовал больше 200 тестировщиков различного уровня и специализации (ручных, автоматизаторов, лидов и т.п.) и составил небольшой список интересных моментов про HTTP, которые вводили в ступор многих.

Для отправки запроса не надо ничего

HTTP версии 1 является текстовым протоколом, это означает, что делать запросы и получать ответ можно не имея никаких специальных программ, кроме, например, telnet и прямой записи в сокет. Описание с примерами: https://stackoverflow.com/questions/15772355/how-to-send-an-http-request-using-telnet Но это, к сожалению, не работает с более новыми версиями протокола.

GET запрос не имеет body

Принято считать, что GET запрос не имеет body, но это не совсем так. В стандарте http просто принято так считать (конвенция), но на сетевом уровне GET запрос от POST никак не отличается, это всего лишь строка в запросе. Например, с помощью curl можно отправить такой запрос:

curl -X GET \
  -H "Content-Type: application/json" \
  -d '{"key": "value"}' \
  http://example.com

Если посмотреть с помощью сниффера, то увидим такой запрос:

GET / HTTP/1.1
Host: example.com
User-Agent: curl/8.7.1
Accept: */*
Content-Type: application/json
Content-Length: 16

{"key": "value"}

Где видим, что body (в конце) также имеется в запросе. Этот метод не везде будет работать, например различные WAF (Web Application Firewall) такие запросы либо заблокируют, либо отрежут body. Более того, вместо GET/POST/PUT… можно указывать любой метод (даже приудманный вами) :)

Данные можно получать только с помощью POST

Опять, это просто общепринятая конвенция, которая постоянно нарушается. Например, есть очень популярный протокол JSON-RPC https://www.jsonrpc.org/specification, в нем все запросы на получение данных, создание, отправку делаются только с помощью POST запросов. Данный протокол очень популярен в криптовалютах, например ethereum, solana.

curl https://docs-demo.quiknode.pro/ \
  -X POST \
  -H "Content-Type: application/json" \
  --data '{"method":"eth_blockNumber","params":[],"id":1,"jsonrpc":"2.0"}'

Коды состояния могут быть любые.

Думаю любого тестировщика на каком-либо собеседовании спрашивали, какие коды статусов вы знаете с разбивкой по категориям (1хх, 2хх и т.д.). Но, также как и метод вы сами можете на стороне сервера возвращать абсолютно любой код и на клиенте с ним как-то работать. Подробнее можно почитать в статье с примерами.

Идемпотентность методов не обязательна

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