Короче, оба предпочтительны;Оба могут возвращать одну и ту же «вещь», но «контекст» различен.
Давайте посмотрим на ваши URL:
/users
: все пользователи /users/1
: пользователь № 1 /users/1/images
: все изображения пользователя № 1 /users/1/images/1
: изображение № 1 пользователя № 1
Всевышеупомянутые URL вращаются вокруг "пользовательского" ресурса.Это «все пользователи», «пользователь», «изображения пользователя» и т. Д.
/images
: все изображения /images/1
: изображение # 1
Все вышеперечисленные URL вращаются вокруг ресурса «изображение».Это «все изображения» или «изображение».
Теперь, на первый взгляд, это различие может показаться относительно незначительным, но при создании API разница может оказать большое влияние на то, как используются данные.
Например, предположим, что вы хотите получить список всех изображений пользователя # 1, что является предпочтительным?
/users/1/images
или
/images?where=user.id eq 1
Первый представляет именно то, что мы хотим, более ограничен и проще для понимания, однако это не означает, что мы не должны также поддерживать вторую форму, так каквозможность запроса может быть весьма полезна.
А что если вы хотите получить список изображений с ассоциированным пользователем?
/users/???
или
/images?include=user
В этом сценарии первый URL не имеет особого смысла, поскольку мы пытаемся получить список изображений, а не пользователей, в то время как второй URL представляет именно то, что мы хотим.
Теперь, что касается безопасности, в идеале это должно быть сделано полностью прозрачным для потребителя способом.Потребитель должен иметь возможность сказать «Я хочу все изображения».и только когда-либо получать все изображения, к которым они имеют доступ.Если они пытаются получить доступ к определенному ресурсу, к которому у них нет доступа, должен быть возвращен соответствующий код ошибки HTTP.