REST - хитрый пример, когда POST не всегда создает новый ресурс - PullRequest
0 голосов
/ 11 января 2020

В моей службе REST у меня есть конечная точка POST /api/images для добавления новых изображений. Но я не хочу добавлять одно и то же изображение несколько раз, поэтому после каждого вызова POST я вычисляю ха sh содержимого, чтобы проверить, существует ли оно уже в моей базе данных - если оно есть, тогда я не добавляю его еще раз, а просто возвращаю идентификатор ранее загруженного.

Как это вписывается в лучшую практику REST, где четко указывается, что после использования POST должен быть создан новый ресурс? Обвиосулы это против, но я не вижу лучшей альтернативы здесь (*). Не уверен, стоит ли мне вообще беспокоиться, но я бы с удовольствием прочитал некоторые варианты по этому вопросу.

(*) Альтернативой, которая, вероятно, удовлетворила бы всех REST-пуристов, было бы изменение цвета: при добавлении нового изображения я должен сначала вызовите GET /api/images, чтобы выяснить, существует ли уже изображение с данным контентом, если да - верните его, в противном случае вызовите POST /api/images, что всегда добавит новый ресурс. НО для этого потребуется 2 HTTP-вызова - стоит ли это того? Тем более, что мы отправляем довольно большие запросы (изображения).

1 Ответ

0 голосов
/ 12 января 2020

Как это вписывается в лучшую практику REST, где четко указано, что после использования POST должен быть создан новый ресурс?

Отлично подходит

1) В HTTP POST не означает "создать ресурс", это означает обработка вложенного представления . Семантика намеренно очень широка.

Помните, что эталонное приложение для архитектурного стиля REST - это всемирная паутина, где POST - единственный небезопасный метод, доступный через HTML форм.

2) HTTP ограничивает семантику запроса , не реализацию.

Я не хочу добавлять одно и то же изображение многократно

Справа - идемпотент Обработка запросов - хорошая идея. Вам не запрещено использовать идемпотентную обработку POST-запросов. Клиенты не могут предполагать , что ваша обработка будет идемпотентной, но вы все равно можете это сделать.

...