Должен ли RESTful HTTP-запрос, который напрямую не приводит к манипулированию данными, но запускает манипулирование, иметь действие GET, PUT или POST?

#http #rest

#http #rest

Вопрос:

Вот вопрос для вас, фанатов RESTful. Позвольте мне подготовить почву.

Допустим, у меня есть удаленная система под названием ChickenShack и локальная система под названием BurgerShack, обе из которых интегрированы таким образом, что каждая система поддерживает «синхронизированную» копию данных объекта. Когда происходит изменение объектов в ChickenShack, он отправляет коллекцию идентификаторов этих объектов в виде запроса RESTful в BurgerShack. Затем BurgerShack отправляет запрос GET в ChickenShack, запрашивая все атрибуты измененной сущности и обновляя локальную копию сущности.

введите описание изображения здесь

Все это асинхронно и разработано с учетом определенных ограничений (так что, если вам это кажется невкусным, поймите, что в жизни иногда нам приходится есть дерьмо и улыбаться).

Мой вопрос: должен ли первоначальный запрос, отправленный из ChickenShack в BurgerShack, быть запросом GET или PUT? Поскольку первоначальный запрос является идемпотентным, часть меня говорит «GET». Тем не менее, это в конечном итоге приводит к изменению данных в Burger, поэтому другая часть меня говорит «ПОМЕСТИТЬ» или «ОПУБЛИКОВАТЬ».

Что вы думаете?

Комментарии:

1. Касательная точка, но обратите внимание, что PUT также является идемпотентным.

2. 1 за то, что вы поставили меня в известность о том, что websequencediagrams.com существует, если нет другой причины. Вау.

Ответ №1:

Я бы выбрал POST , потому что:

  • он изменяет состояние в BurgerShack (я не думаю, что это идемпотентно, потому что он запускает GETs из BurgerShack в ChickenShack)
  • он не создает новый ресурс по этому конкретному URL (что исключает PUT )

Комментарии:

1. 1, также: GET было бы неуместно (вы не получаете доступ к ресурсу burger). И, как указано @Waldheinz, PUT не подходит (вы не создаете ресурс burger)

2. Он идемпотентен. Вы можете повторить POST и в конечном итоге получить то же состояние в BurgerShack.

3. @Paul Есть разница между can и have to , чтобы запрос был идемпотентным, должно быть гарантировано, что вы можете повторить его без изменения состояния.