RESTful способ обновления всех ресурсов - PullRequest
0 голосов
/ 30 сентября 2019

Я хочу внести общие изменения во все ресурсы, предоставляемые API. Например, предположим, что API выставляет всех учеников класса, и вы хотите установить общий курс для всех учеников.

Один из способов - запросить API, один за другим илив пакетном обновлении свойство ресурсов. Однако для этого потребуется сначала получить все ресурсы, затем обновить их свойство, а затем отправить и опубликовать запрос.

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

Любое предложение о том, как это может быть достигнуто с помощью дизайна RESTful?

Обновление 1:

Другими словами, я хотел бы обновить одно поле всех ресурсов до общего значения без необходимости сначала извлекать ресурсы. Итак, я не хочу реализовывать что-либо как следующее, потому что у меня есть миллионы ресурсов, которые я не хочу сначала получить все их идентификаторы, а затем создать объект json следующим образом:

PATCH /items
[ { id: 1, name: 'foo' }, { id: 2, name: 'bar' } ]

Ответы [ 3 ]

1 голос
/ 30 сентября 2019

Используйте PATCH. Ссылка RFC5789 и RFC6902 для получения более подробной информации.

Образец:

PATCH /api/classes/123/students
[ { id: 1, name: 'foo' }, { id: 2, name: 'bar' } ]

YouПридется выбрать, как обрабатывать ошибку в вашем ответе, либо сделать ее атомарной, либо нет.

  • Для атомарной строки с ошибкой будет выполнен весь ваш запрос 400.
  • Для не-atomic, у вас будет 200 с сервера с подробными сведениями об ошибках в его теле.

Оба случая имеют свои плюсы и минусы с точки зрения потребителя API. Необходимо принять решение в отношении вашего варианта использования.

Обновление 1:

Не предоставляя список конечной точке без определенного идентификатора, вы выполняете это действиесо всей коллекцией.

Предоставляя подобное тело JSON, следует установить для всех предоставленных свойств значение, указанное для каждой записи в этой коллекции:

PATCH /api/classes/123/students
{ courses: [ commonCourse1, commonCourse2 ] }
0 голосов
/ 01 октября 2019

Вы все еще можете создать конечную точку, как / items / update / all, и передать свое значение:

POST /api/items/update/all 
{
  "value": 123
}

Далее вам просто нужно правильно обработать ее. Например, просто напишите SQL-запрос, например:

UPDATE Items
SET value=POST["value"];
0 голосов
/ 30 сентября 2019

Если ученики уже распределены по классу, то я не думаю, что есть проблема с их заменой на что-то вроде:

/api/class/123/updateCourse?newCourse=456

class ClassController
{
   public IResult UpdateCourse(int class, int newCourse)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...