Как реализовать в HTTP заголовках сервис, который принимает JSON и отвечает текстом
Что проверяют
Понимаете ли вы, какие заголовки описывают контракт такого сервиса и какие коды он обязан вернуть при нарушении. От QA здесь ждут не столько код сервера, сколько набор проверок. Следом обычно спрашивают, чем Content-Type отличается от Accept и что вернёт сервис на битый JSON.
Как отвечать
Сначала контракт по заголовкам:
- запрос:
Content-Type: application/jsonсообщает формат тела,Accept: text/plainговорит, какой ответ клиент готов принять; - ответ:
Content-Type: text/plain; charset=utf-8. Без кодировки кириллица в ответе может превратиться в кракозябры; - коды:
200на успех,400на синтаксически битый JSON,415 Unsupported Media Typeна тело не того формата по заголовку,406 Not Acceptable, если клиент вAcceptне принимает текст,405с заголовкомAllowна чужой метод,413на слишком большое тело. Для валидного JSON с неверными полями часто берут422.
Дальше набор проверок, который прогоняется в Postman, через curl -i или автотестом на pytest с requests:
- позитивный сценарий: валидный JSON, проверка кода, тела и заголовка
Content-Typeв ответе; - заголовки запроса: нет
Content-Type, стоитtext/plainпри валидном теле,Accept: application/json; - тело: битый JSON, пустое тело,
null, массив вместо объекта, лишние и отсутствующие поля; - кодировка: кириллица и эмодзи в значениях, ответ приходит в заявленной кодировке.
Где спотыкаются
Путают Content-Type и Accept и пытаются указать формат тела через Accept. Сервер смотрит на Content-Type, а curl -d без явного заголовка отправляет application/x-www-form-urlencoded, и запрос честно получает 415.
Проверяют только тело ответа и не смотрят на заголовки. Сервис отдаёт текст с Content-Type: application/json, клиент пытается его распарсить и падает, а тест при этом зелёный.
Считают любой отказ ошибкой 400. Для QA важно различать: 415 значит неверный формат по заголовку, 400 означает сломанный синтаксис, 422 говорит о смысловой ошибке в данных. Баг-репорт «вернулся не тот код» без этого различия выглядит неубедительно.