Подтвердить что ты не робот

Измените порядок массива/коллекции с помощью REST API

Знаете ли вы какую-либо "лучшую практику" для разработки метода REST для изменения порядка небольшой коллекции?

У меня есть коллекция, выставленная на "GET/api/v1/items". Эта конечная точка возвращает массив JSON, и каждый элемент имеет уникальный идентификатор.

Я думал создать "PATCH/api/v1/items" и отправить массив идентификаторов с новым порядком. Но я задаюсь вопросом, есть ли альтернатива или шаблон дизайна для выполнения этой задачи должным образом.

4b9b3361

Ответ 1

Следуя ограничению интерфейса REST Uniform Interface, методы HTTP PUT и PATCH должны придерживаться стандартной семантики, поэтому вы можете сделать это с помощью одного из следующих способов:

С PUT клиенты могут загружать все новое представление в желаемом порядке. Они запросят GET /api/v1/items, измените порядок по мере необходимости и верните его с помощью PUT /api/v1/items.

С помощью PATCH клиенты могут отправить документ diff, который выполняет изменение заказа по мере необходимости. Вы можете использовать формат json-patch, и клиенты выполняют изменения с помощью операций move и массивов.

Имейте в виду, что ни один из них не является образцом дизайна или передовой практикой. Они просто как методы PUT и PATCH должны работать. В идеале это должно работать над любым RESTful-приложением, правильно использующим методы GET, PUT и PATCH для ресурса в этом URI, и что красота REST. Если вы сделаете это правильно, вам нужно сделать это только один раз, и клиенты могут обобщить для всех. Например, клиент может выбрать способ PUT с небольшими коллекциями и PATCH для более крупных.

Обе вашей идеи использовать PATCH с массивом id, а answerfrom @dit, предлагающий сделать это с помощью PUT, на самом деле не являются RESTful, потому что они ломаются со стандартной семантикой: для вас не используется дельта format, его для частичных обновлений с помощью PUT. Однако оба эти параметра могут быть RESTful, если выполнены с помощью POST. POST - это метод для любого действия, которое не стандартизировано протоколом HTTP, поэтому вы можете делать с ним все, что хотите, но вам нужно документировать, как именно это сделать.

Итак, это вам. Если вы вообще обеспокоены тем, что являетесь RESTful, и ваша заявка имеет долгосрочные цели - я говорю годы или даже десятилетия - я бы сказал, чтобы пойти на единообразную реализацию методов PUT и PATCH, как было предложено первый. Если вы предпочитаете простой подход, используйте свою или идею с помощью POST.

Ответ 2

ok, у меня была аналогичная проблема, и я попытаюсь объяснить, как я ее решил.

В моем велосипедном туре около 5 станций. Каждая станция имеет уникальный идентификатор и номер заказа:

stations": [

    {
        "uid": 1,
        "order": 1
    },
    {
        "uid": 2,
        "order": 2
    },
    {
        "uid": 3,
        "order": 3
    },
    {
        "uid": 4,
        "order": 4
    },
    {
        "uid": 5,
        "order": 5
    }

]

Каждый раз, если порядок одного элемента был изменен (перетаскивание), я отправляю запрос REST на мой веб-сервис.

Предположим, мы хотим переместить станцию ​​uid = 3 на одну позицию вниз. Станция с uid = 3 идет вниз, а станция с uid = 4 поднимается. Поэтому мой запрос PUT выглядит следующим образом:

...myapplication.com/api/changeorder?station=3&direction=down

Теперь, на стороне сервера, мне просто нужно найти элементы, затронутые этим действием вниз, и обновить их порядок в моей базе данных. Мой веб-сервис REST отправляет OK, если обновление было успешным.

В моем случае нет необходимости отправлять новый отсортированный список, потому что мой пользовательский интерфейс всегда менялся с помощью операции перетаскивания.