3 заголовка, которые я проверяю первыми (и вам советую)
Я не смотрю тело ответа, пока не проверил шапку.
Звучит как странный ритуал, но за 5+ лет я привык: баги сидят не в JSON, а в том, что сервер думает про твой запрос.
🔥 Content-Type
Content-Type в запросе - это униформа. Одел application/json - значит, "я JSON". Одел text/plain - значит, "я просто текст".
Большинство фреймворков ВООБЩЕ не проверяют униформу. И чем больше остается на откуп фреймворку - тем больше дыр в безопасности сервиса.
Схема, rate limit, логи: всё валится, уже писал подробно тут 👉 и всем рекомендую заглянуть.
Проверяется за 10 секунд: curl -X POST /api/users -H "Content-Type: text/plain" -d '{"role": "admin"}'
200 OK вместо 415 Unsupported Media Type => дверь открыта, звоним команде.
⚡️ Cache-Control Самый коварный заголовок - баг плавающий.
Обновил данные - API отвечает старыми. Перезашёл - новыми. MAGIC 🪄
На самом деле - сервер закэшировал ответ и радует пользователей вчерашними новостями.
Я такое ловил на проде: пользователи жалуются, что данные не обновляются. Девопсы клянутся: "всё чистили". А ответ всё равно летит из кэша, потому что Cache-Control не настроен.
Тоже 10 секунд на локализацию и все поймешь:
POST на создание → GET на чтение. Ответ без Cache-Control: no-cache ? С вероятностью 90% там кэш.
PUT/PATCH а потом снова GET. → Свежие данные? Всё ок. Закэшированное старьё? -> Баг репорт! Если баг «плавает» - кинь в URL параметр ?v=1. Баг исчез? Поздравляю, ты локализовал проблему.
👉 Подробный разбор кэширования с примерами:
🛡 CORS
Любимая отмазка фронтендеров: CORS - это не наша проблема
На самом деле CORS - это пояс верности акт доверия****❤️
Сервер говорит браузеру: "этому домену я доверяю".
Если CORS настроен через * - доверять можно всем. Включая сайт, который украдёт твои данные.
10 секунд на локализацию: Шлёшь запрос с Origin: https://evil.com Смотришь Access-Control-Allow-Origin в ответе. Если там ***** или твой evil.com - у тебя проблемы.
Кидай в комментах, какие находил баги в заголовке.
Пишу свою намеренно БAГОВАННУЮ АПИ-шку, собираю кейсы. Делитесь, дам попробовать до запуска :)
В этом посте были ссылки, но мы их удалили по правилам Сетки