Я думаю, что вы можете использовать метод POST или PATCH для решения этой проблемы, поскольку они обычно предназначены для этого.
Использование POST
метода обычно используется для добавления элемента при использовании в ресурсе списка, но вы также можете поддерживать несколько действий для этого метода. См. Этот ответ: Как обновить коллекцию ресурсов REST . Вы также можете поддерживать различные форматы представления для ввода (если они соответствуют массиву или отдельным элементам).
В этом случае нет необходимости определять ваш формат для описания обновления.
Использование PATCH
метода также подходит, поскольку соответствующие запросы соответствуют частичному обновлению. Согласно RFC5789 ( http://tools.ietf.org/html/rfc5789 ):
Некоторым приложениям, расширяющим протокол передачи гипертекста (HTTP), требуется функция частичной модификации ресурсов. Существующий метод HTTP PUT позволяет только полную замену документа. Это предложение добавляет новый метод HTTP, PATCH, для изменения существующего ресурса HTTP.
В этом случае вы должны определить свой формат для описания частичного обновления.
Я думаю, что в этом случае POST
и PATCH
они довольно похожи, поскольку вам действительно не нужно описывать операцию для каждого элемента. Я бы сказал, что это зависит от формата отправляемого представления.
В случае PUT
с немного менее ясно. Фактически, при использовании метода PUT
вы должны предоставить весь список. По сути, предоставленное представление в запросе будет заменять ресурсное представление списка.
У вас может быть два варианта путей к ресурсам.
- Использование пути к ресурсу для списка документов
В этом случае вам необходимо явно указать ссылку на документы с подшивкой в представлении, которое вы указываете в запросе.
Вот примерный маршрут для этого /docs
.
Содержание такого подхода могло бы быть для метода POST
:
[
{ "doc_number": 1, "binder": 4, (other fields in the case of creation) },
{ "doc_number": 2, "binder": 4, (other fields in the case of creation) },
{ "doc_number": 3, "binder": 5, (other fields in the case of creation) },
(...)
]
- Использование пути субресурсов связующего элемента
Кроме того, вы также можете рассмотреть возможность использования подмаршрутов для описания связи между документами и связующими. Подсказки относительно связи между документом и подшивкой теперь не нужно указывать в содержимом запроса.
Вот примерный маршрут для этого /binder/{binderId}/docs
. В этом случае отправка списка документов с помощью метода POST
или PATCH
прикрепление документов к связыванию с идентификатором binderId
после создания документа, если он не существует.
Содержание такого подхода могло бы быть для метода POST
:
[
{ "doc_number": 1, (other fields in the case of creation) },
{ "doc_number": 2, (other fields in the case of creation) },
{ "doc_number": 3, (other fields in the case of creation) },
(...)
]
Что касается ответа, вам решать, какой уровень ответа и какие ошибки нужно вернуть. Я вижу два уровня: уровень статуса (глобальный уровень) и уровень полезной нагрузки (более тонкий уровень). Также вам решать, должны ли все вставки / обновления, соответствующие вашему запросу, быть атомарными или нет.
В этом случае вы можете использовать статус HTTP. Если все будет хорошо, вы получите статус 200
. Если нет, то другой статус, например, 400
если предоставленные данные неверны (например, неверный идентификатор связующего) или что-то еще.
В этом случае 200
будет возвращен статус , и ответное представление должно описать, что было сделано и где в конечном итоге возникают ошибки. ElasticSearch имеет конечную точку в своем REST API для массового обновления. Это может дать вам некоторые идеи на этом уровне: http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/bulk.html .
Вы также можете реализовать асинхронную обработку для обработки предоставленных данных. В этом случае возвращается статус HTTP 202
. Клиенту необходимо получить дополнительный ресурс, чтобы увидеть, что происходит.
Прежде чем закончить, я также хотел бы отметить, что спецификация OData решает проблему, касающуюся отношений между сущностями с функцией, называемой навигационными ссылками . Возможно, вы могли бы взглянуть на это ;-)
Следующая ссылка также может вам помочь: https://templth.wordpress.com/2014/12/15/designing-a-web-api/ .
Надеюсь, это поможет тебе, Тьерри
GET /docs
и получить все документы в пределах определенного связующегоGET /docs?binder_id=x
. Чтобы удалить подмножество ресурсов, яDELETE /docs?binder_id=x
должен позвонить или должен позвонитьDELETE /docs
с a{"binder_id": x}
в теле запроса? Вы когда-нибудь использовалиPATCH /docs?binder_id=x
бы пакетное обновление или простоPATCH /docs
передавали пары?