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

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

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

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


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

Класс-обработчик сам распределяет запросы по методам: сервер вызывает do_GET для GET, do_POST для POST, do_DELETE для DELETE — по одному методу на каждый HTTP-метод. На создание сервер отвечает 201 Created и указывает на новый ресурс заголовком Location; на удаление — 204 No Content: успех, и сказать больше нечего.

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

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

Prompt
Напишите программу на Python с обработчиком заметок, который отвечает на GET /notes кодом 200 и строкой со списком, на POST /notes — кодом 201 и заголовком Location, а на DELETE /notes/3 — кодом 204 и пустым телом. Запустите сервер на свободном порту, отправьте три запроса и выведите для каждого метод, код состояния и заголовок Location или тело, если они есть.
Вывод: полная программа на Python

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

Ошибки тоже требуют точности: отсутствующий ресурс — это 404 Not Found (с телом ошибки в JSON, чтобы его могли прочитать программы), а неподходящий метод на маршруте только для чтения — это 405 Method Not Allowed; здесь его возвращает крошечный do_DELETE. (Если совсем не писать этот метод, http.server сам ответит 501 Unsupported method — но самостоятельно вернуть 405 — более точный ответ в духе REST.)

На стороне клиента urllib выбрасывает HTTPError на каждый ответ 4xx и 5xx, а не возвращает его молча — объект ошибки всё равно содержит код состояния и тело.

200, 404 и 405

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

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