Какие обязательные атрибуты у POST-запроса
Что проверяют
Знаете ли вы, из чего на самом деле состоит HTTP-запрос, и отличаете ли обязательное по протоколу от того, что требует конкретный API. Следом обычно просят собрать запрос в curl или Postman и спрашивают, какие коды ответа проверять в негативных сценариях.
Как отвечать
По протоколу HTTP/1.1 обязательного немного:
- стартовая строка: метод, путь к ресурсу и версия протокола, например
POST /api/orders HTTP/1.1; - заголовок
Host: клиент обязан его отправить, а на запрос без него сервер должен ответить400 Bad Request; - длина тела: если тело есть, нужен
Content-LengthилиTransfer-Encoding: chunked, иначе сервер не поймёт, где тело кончается. Некоторые серверы и на пустой POST безContent-Lengthотвечают411 Length Required.
Тело у POST по протоколу не обязательно, а Content-Type формально лишь рекомендован, хотя без него API данные не разберёт. В HTTP/2 те же сведения передаются псевдозаголовками :method, :path, :scheme и :authority.
Дальше скажите, что обязательным делает конкретный API, потому что именно это и тестируется:
Content-Type:application/json,multipart/form-dataилиapplication/x-www-form-urlencoded. Неподдерживаемый тип даёт415 Unsupported Media Type;Authorization: без токена401, без прав403;- тело: битый JSON обычно даёт
400, невалидные поля400или422, зависит от API.
Успешный POST, создающий ресурс, по соглашению возвращает 201 Created с заголовком Location, но встречаются и 200, и 204. В curl ключ -d сам делает запрос POST и ставит Content-Type: application/x-www-form-urlencoded, а для JSON есть --json, который выставляет и Content-Type, и Accept.
Где спотыкаются
Включают статус ответа в атрибуты запроса. Код относится к ответу сервера, в запросе его нет.
Считают, что POST без тела невозможен. Он допустим, так часто устроены действия вроде POST /orders/42/cancel.
Путают POST с PUT и говорят, что POST «создаёт или обновляет». Идемпотентен PUT, а повторный POST может создать второй заказ, поэтому для заказов и платежей проверяют защиту от повтора, например ключ идемпотентности.