У меня есть два ресурса: пользователи и ссылки.
Пользователи могут иметь несколько ссылок, связанных с ними. Я разработал мой RESTful API, чтобы вы могли получить доступ к ссылкам, связанным с пользователем, по следующему URI:
/users/:id/links
Однако мне всегда нужно иметь URI только для ссылок - иногда мне могут понадобиться все ссылки независимо от пользователя.
Для этого у меня есть:
/links
Это звучит нормально? Наличие двух URI для ссылок?
Интересно, должен ли я вместо этого получить ссылки для пользователя с таким URI, как:
/links/user/:id
или /links/?user=:id
Таким образом, у меня есть только один ресурс для ссылок.
api
rest
api-design
Оливер Джозеф Эш
источник
источник
/links/user/:id
/users/:id/links
) или метод строки запроса (/links/?user=:id
), поскольку на самом деле это запрос./links/user/:id
может выглядеть красиво и / или быть проще в некоторых фреймворках, но на самом деле это довольно запутанно.Ответы:
Нет, нет ничего плохого в наличии нескольких ресурсов для одной и той же «вещи», в данном случае это списки ссылок.
Недавно мы боролись с той же проблемой. Нашим решением было иметь все ресурсы там, где нет строгой собственности, чтобы не быть вложенными. Другими словами, ссылки будут смоделированы под
Затем фильтры коллекции ссылок выражаются в виде параметров запроса. Таким образом, чтобы получить ссылки определенного пользователя, вы должны использовать:
Это также позволяет упростить состав фильтров:
И это легко понять концептуально - у вас есть набор предметов, и вы добавляете в него фильтры.
При этом нет ничего более «RESTful» в этом подходе, чем любая другая схема именования URI. Это просто соглашение, которое мы нашли понятным человеку, и нам, разработчикам, легко понять и принять его. REST не заботится о том, что вы указали в идентификаторах ресурсов.
источник
?user=users/:userid
строка в запросе; что не так с просто?userid=:userid
?"/*******"
; где*
непрозрачные. но тот же самый идентификатор всегда можно использовать для ссылки на этот ресурс (например, со ссылками), для получения самой последней версии этого ресурса и так далее. содержимое этого URI понимается только сервером происхождения. Это также означает, что если нужно изменить идентификаторы, скажем/realm/:businessid/users/:id
, клиент вообще не меняется./users/:userid/links
и/links?userid=:userid
? В обоих случаях идентификаторы не меняются, они выбирают текущую версию этого ресурса, и клиент обрабатывает их одинаково. Канонического URL для этого не существует, потому что это не ресурс, а запрос, так что это всего лишь два разных типа синтаксиса запроса. Мне также не ясно, как клиенту не нужно будет меняться, если структура URL меняется; это считается серьезным изменением в REST, если только не установлен 301./links
поддерживает интерфейс запросов,/links?user=/users/123
разрешает подход черного ящика к идентификаторам ресурсов в клиентах,/links?userid=123
который не поддерживает. последнее требует от клиента понимания, что такое идентификатор пользователя и как его получить, по-видимому, из ресурса, полученного из/users/123
или/links/456/user
. Первый означает, что клиент может использовать URI без изменений; Предположим, что/links/.../user
дает ответ гипермедиа (скажем, сLocation:
заголовками).Так что меня беспокоит: / users /: userid / links возвращает «links», НО, если user_id не идентифицирован, это должно вернуть 404.
тем не мение
/ links? userid =: userid потенциально мог бы вернуть пустой список (по сути, 200), что на самом деле, вероятно, ошибка. И вполне возможно.
Несмотря на то, что оба работают, вложение дает вам дополнительные функциональные возможности, которые вы можете использовать позже.
источник