Перейти к основному содержимому

Говорите то, что имеете в виду

REST API общается с помощью двух словарей. Метод говорит, чего хочет клиент: GET — прочитать, POST — создать, PUT — заменить, PATCH — изменить часть, DELETE — удалить. Код состояния говорит, как всё прошло: 2xx — успех, 4xx — ошибка клиента, 5xx — ошибка сервера.

Деталь, которую стоит знать: PUT идемпотентен — отправить его дважды всё равно что один раз. POST — нет: два POST создадут два ресурса.


Правильный метод

Маршрутизатор сопоставляет и метод, и путь, поэтому у каждого глагола свой обработчик. Создание отвечает 201 Created и указывает на новый ресурс заголовком Location; удаление отвечает 204 No Content — успех, о котором нечего сказать, поэтому тело остаётся пустым.

GET, POST и DELETE для одного ресурса

Три глагола, три ответа: список возвращается с кодом 200, создание — с 201 и заголовком Location, удаление — с 204 и пустым телом.

Prompt
Напишите программу на TypeScript с небольшим маршрутизатором, учитывающим метод, который обрабатывает GET /notes (200 со строкой списка), POST /notes (201 с заголовком Location) и DELETE /notes/{id} (204, пустое тело). Запустите его на порту 0, отправьте три запроса с помощью fetch и выведите каждый метод, код состояния и заголовок Location или тело, если они есть.
Вывод: программа на TypeScript и захваченный вывод

Правильный код состояния

Ошибки тоже заслуживают точности: отсутствующий ресурс — это 404 Not Found, с телом ошибки в формате JSON, чтобы его могли прочитать машины. Неверный глагол для известного пути — это 405 Method Not Allowed.

Здесь никто не отправит этот 405 за вас. Маршрутизатор проверяет обе части отдельно: если путь какого-то маршрута совпал, но метод не совпал ни у одного, он отвечает 405 и добавляет заголовок Allow со списком глаголов, которые сработали бы.

200, 404 и 405

Существующая заметка возвращает 200 с данными, отсутствующая — 404 с ошибкой в формате JSON, а DELETE для маршрута, поддерживающего только GET, отклоняется самим маршрутизатором с кодом 405.

Prompt
Напишите программу на TypeScript с обработчиком GET /notes/{id}, который возвращает 200 и JSON для существующей заметки и 404 с телом ошибки в формате JSON для отсутствующей, а также маршрутизатор, который отвечает 405 с заголовком Allow, когда путь совпадает, а метод — нет. Запустите его на порту 0, затем запросите существующую заметку, отсутствующую заметку и выполните DELETE по тому же пути, выведя все три результата.
Вывод: программа на TypeScript и захваченный вывод