Для простоты, скажем, у меня есть ресурс пользователей . HTTP-вызов GET users / возвращает список ссылок для конкретных пользователей:
<users>
<link rel='user' href='/users/user/1/'/>
<link rel='user' href='/users/user/2/'/>
<link rel='user' href='/users/user/3/'/>
....
</users>
Представление результата описано в конкретном типе носителя:
application/vnd.company.Users+xml
В нашем веб-интерфейсе мы хотим отобразить таблицу со всеми пользователями. Это означает, что мы должны иметь возможность извлекать отображаемую информацию о пользователе, такую как имя, пол, друзья, ... Я хотел бы избежать необходимости отдельного запроса для каждого пользователя ( GET / users / user / x / ), чтобы получить эту информацию. Кроме того, некоторые веб-интерфейсы будут отображать только имя, в то время как другие веб-интерфейсы будут отображать имя и его / ее друзей. И так далее.
По сути, мы по-прежнему возвращаем пользователей, но с расширениями, зависящими от потребностей внешнего интерфейса.
Какой вариант вы бы выбрали? Почему?
(1) Сделать GET users / настраиваемыми с помощью параметров, чтобы настройки отображались в списке. В зависимости от настроек могут быть возвращены разные типы носителей, поскольку синтаксис одной версии / комбинации может сильно отличаться от синтаксиса другой версии / комбинации:
GET users/ -> application/vnd.company.Users+xml
GET users/?fields=name,gender -> application/vnd.company.Users+xml
GET users/?fields=name,gender,friends -> application/vnd.company.UsersWithFriends+xml
(2) Разные ресурсы создаются для различения разных типов носителей. Параметры по-прежнему используются для основных настроек, охватываемых типом носителя. Это дает:
GET users?fields=name -> application/vnd.company.Users+xml
GET users?fields=name,gender -> application/vnd.company.Users+xml
GET users_with_friends?fields=gender -> application/vnd.company.UsersWithFriends+xml
(3) То же, что и (1), но вместо параметров желаемый тип носителя устанавливается клиентом в заголовке Accept. Настраиваемые поля, охватываемые типом носителя, по-прежнему задаются с помощью параметров:
GET users/?fields=name ACCEPT application/vnd.company.Users+xml
GET users/?fields=name,gender ACCEPT application/vnd.company.Users+xml
GET users/?fields=name,gender ACCEPT application/vnd.company.UsersWithFriends+xml
(4) Что-то еще?
Чтобы ответить на мой собственный вопрос, я думаю, что:
- Решение (1) очень, очень неправильно. Тип носителя не должен зависеть от параметров.
- Решения (2) и (3) более или менее равны и соответствуют предпочтениям. Я предпочитаю (3), так как это не приведет к взрыву ресурсов, которые будут представлены. Кроме того, по сути, мы все еще возвращаемся пользователям. Единственная разница - это количество информации, отображаемой разными типами медиа, которая возвращается. Таким образом, можно утверждать, что нет реальной необходимости вводить новые ресурсы, как это сделано в (2).
Вы согласны? Что ты думаешь?