Я работаю над REST-ful API, в котором ресурсы, которые довольно взаимосвязаны. Ресурсы ссылаются друг на друга, и эти ссылки могут быть созданы или удалены. Я немного неопределен, как поддерживать объединение ресурсов вместе, когда они ссылаются друг на друга с помощью гиперссылок.Как обрабатывать обновления ресурса REST при использовании гипермедиа-ссылок
Вот простой пример с двумя ресурсами, A и B.
Resource A: name: integer list_b: [list of resource B] Resource B: id: integer description: String
Теперь, не включает в себя B в своем документе, а скорее ссылки на него. При использовании гипермедиа, это может выглядеть примерно так:
Resource A: { id: 1, list_b: [ { id: 1, href: "https://server/api/b/1" }, { id: 2, href: "https://server/api/b/2" } ] }
Если пользователь хочет добавить или удалить одну из ссылок B в список А, то как они делают это, принимая во внимание наличие гиперссылки? Я хочу, чтобы пользователь мог обновить весь ресурс A в одной операции PUT, но ничего на выходе не указывает, какое значение для B требуется. Это имеет смысл для меня пользователю выполнять PUT с содержанием, как это:
Resource A: { id: 1, list_b: [ { id: 1, href: "https://server/api/b/1" }, { id: 2, href: "https://server/api/b/2" }, { id: 3 }, ] }
и получить обновленный ресурс (в ответ), как это:
Resource A: { id: 1, list_b: [ { id: 1, href: "https://server/api/b/1" }, { id: 2, href: "https://server/api/b/2" }, { id: 3, href: "https://server/api/b/3" } ] }
Я беспокоюсь, что пользователь не обязательно будет знать, что включать в ресурс при обновлении ресурса A list_b
.
При работе с гиперссылками с одного ресурса на другой, как следует создавать и обновлять работу? Если клиентам разрешено обновлять часть ссылки (id
), или им необходимо будет обновить обе части ссылки?
Примечание: Я знаю, что другой подход может быть обнажая вложенную URL для ресурса A. Это может выставить list_b
как ресурс, который предназначен через HTTP (что позволяет клиентам использовать POST, PUT и DELETE на ресурсе списка сам). Но это кажется менее разумным, если A содержит несколько ссылок на другие типы ресурсов. Каждое поле, которое ссылается на другое, потенциально требует суб-url, который, если есть 10+ полей, является громоздким и требует нескольких HTTP-запросов для обновления ресурса.
Спасибо за ваши мысли. Вы правы в том, что ресурсы, с которыми я работаю, намного сложнее и действительно имеют свою собственную модель использования в качестве первоклассных ресурсов (мой пример, по общему признанию, очень прост). Все создания ресурсов в этом API действительно возвращают URL-адреса в заголовке местоположения, поэтому звучит так, будто вы говорите, что list_b может быть ограничен только содержащимися URL-адресами (без идентификаторов), которые клиент должен иметь в любом случае. Если пользователь хотел добавить существующий ресурс B в этот список, он будет использовать URL-адрес. Это справедливое толкование? – bedwyr
Да, не зная дальнейших подробностей, я бы сказал, что это справедливое толкование. – Jollymorphic
Еще раз спасибо. Так что бы вы выступали за все ссылки на ресурсы в сущности (я знаю, это радикальное обобщение), чтобы быть просто URL-адресом? – bedwyr