Как реализована отправка JSON в API
Что проверяют
Понимаете ли вы, из чего состоит запрос с JSON-телом и что в нём может пойти не так: умеете не только отправить запрос, но и осмысленно его сломать. Следом обычно просят назвать негативные проверки для такого эндпоинта.
Как отвечать
Сначала анатомия запроса: метод (POST для создания, PUT для полной замены, PATCH для частичной), заголовок Content-Type: application/json, при необходимости Accept и авторизация, тело в UTF-8.
Затем инструменты, которыми вы реально пользуетесь:
- Postman или Insomnia: тело raw JSON, заголовок подставится сам, проверки в тестах коллекции, прогон в CI через Newman;
- curl:
curl -X POST -H "Content-Type: application/json" -d '{"name":"Ann"}' URL, в свежих версиях короче через--json; - Python:
requests.post(url, json=payload)сам сериализует словарь и ставит заголовок,json.dumpsвручную не нужен; - Java: REST Assured,
given().contentType(ContentType.JSON).body(dto).when().post("/users").then().statusCode(201).
Проверять стоит больше, чем код ответа. Создание обычно возвращает 201 Created, а не 200. Тело ответа сверяется со схемой (jsonschema в Python, matchesJsonSchemaInClasspath в REST Assured), а результат по возможности подтверждается повторным GET или запросом в базу.
Негативные сценарии:
- нет обязательного поля или неверный тип: ожидаем
400или422с понятным сообщением; - синтаксически битый JSON и пустое тело: тоже
400, но никак не500; - неверный
Content-Type: корректный ответ415 Unsupported Media Type; - границы и спецсимволы: длинные строки, эмодзи,
nullпротив отсутствующего поля, очень большие числа; - авторизация: без токена
401, с чужими правами403.
Где спотыкаются
Сериализуют дважды: requests.post(url, json=json.dumps(data)) отправит не объект, а строку с экранированными кавычками. Сервер отвечает ошибкой, а тестировщик ищет баг в API.
Проверяют только статус. Ответ 200 с пустым телом или с неправильно сохранёнными полями такой тест пропускает.
Считают 500 на некорректный ввод нормальной реакцией. Ошибка клиента должна давать 4xx, а 500 в таком сценарии это баг, который нужно заводить.