Чем характеризуется HTTP протокол, какие у него методы и заголовки
Что проверяют
Понимаете ли вы, что происходит между вашим fetch и ответом сервера. Фронтендеру этот вопрос задают не ради определения из учебника, а чтобы понять, сможете ли вы прочитать вкладку Network и объяснить, почему запрос ушёл дважды, почему браузер отдал ответ из кэша и откуда взялась ошибка CORS.
Как отвечать
Начните с характеристик, которые влияют на вашу работу:
- без состояния: сервер не помнит предыдущий запрос, поэтому сессия держится на куках или токене в заголовке;
- запрос и ответ: инициатор всегда клиент, сервер сам ничего не пришлёт, для этого есть WebSocket и SSE;
- текстовый только в первой версии: HTTP/1.1 читается глазами, HTTP/2 и HTTP/3 бинарные, с мультиплексированием и сжатием заголовков;
- расширяемый: свои заголовки, свои коды, апгрейд соединения.
Методы: GET читает, POST создаёт или запускает действие, PUT заменяет ресурс целиком, PATCH меняет часть, DELETE удаляет, OPTIONS браузер шлёт сам в предварительном запросе CORS. Важнее назвать два свойства: безопасность (метод не меняет состояние) и идемпотентность (повтор даёт тот же результат). GET обладает обоими, PUT и DELETE только идемпотентны, POST ни то ни другое, поэтому двойной клик по кнопке оплаты создаёт два заказа.
Заголовки, которые фронтендер трогает руками: Content-Type, Authorization, Accept, Cache-Control вместе с ETag и If-None-Match, Origin с группой Access-Control-Allow-*, Cookie и Set-Cookie.
Где спотыкаются
Называют HTTP протоколом с состоянием, потому что сайт помнит логин. Состояние держит приложение поверх протокола, сам HTTP каждый запрос видит впервые.
Второе: путают безопасность метода с идемпотентностью и заявляют, что GET нельзя кэшировать, а POST можно спокойно повторять. На практике всё наоборот, и на этом ломаются повторные отправки запроса.
Третье: считают, что CORS придумал сервер. Ограничение браузерное: сервер ответ отдал, а браузер его не показал, пока не увидел нужные заголовки. Отсюда ошибка в консоли при полностью успешном запросе в логах бэкенда.