Как вы получаете RESTful-ресурс чем-то другим, кроме ID? - PullRequest
4 голосов
/ 30 января 2009

Могут быть ситуации, когда мне нужно будет найти объект по параметрам, отличным от ID. Какой правильный RESTful способ сделать это?

Например, я мог бы захотеть найти User по username и password, поэтому строго RESTful "GET /users/1" не сработает.

Согласно документации Rails это шаблон URL для получения всех экземпляров ресурса: "GET /users". Я мог бы добавить к этому параметры: "GET /users?username=joe&password=topsecret", но это исказило бы официальную цель запроса GET.

Ответы [ 2 ]

12 голосов
/ 30 января 2009

"GET / users? Username = joe & password = topsecret", но это исказит официальную цель запроса GET. "

Нет, это ничего не извращает. Это абсолютно правильный и RESTful способ сделать это, и это рекомендуемый способ получения динамических результатов в спецификации http. REST не заботится о том, что в URL, только то, что он уникален. URL-адрес этой страницы может быть http://3f778a9b8a7c778696e для всех задач архитектуры REST, если это единственный способ добраться до него, и он никогда не приведет ни к чему другому.

http определяет протокол строки запроса для возврата динамических результатов. Учитывая текущее состояние вашей базы данных, строка запроса, которую вы предоставляете вашему приложению, должна всегда возвращать один и тот же результат. Тогда это будет RESTFUL. Эстетика URL - это совсем другая проблема, чем REST.

в соответствии с архитектурой REST, правила запроса GET заключаются в том, что он всегда возвращает одни и те же результаты (или поддерживает одни и те же результаты в течение достаточно продолжительных периодов времени, так что кэширование работает), и что GET не имеет побочных эффектов. последствия. GET должен быть идемпотентом (всегда возвращать одни и те же результаты, независимо от того, сколько раз вы его называете) и не заставлять систему менять состояние. То есть это .

Конечно, вам не нужно использовать протокол запроса. Вы можете поместить параметры в прямую косую черту, между точками с запятой, или это может быть GUID в кодировке base64. Это зависит только от вас, если вы следуете этим простым правилам.

2 голосов
/ 30 января 2009

Несколько клавиш не успокаивают, не так ли? Возможно /users/[username]?password=secret. Кроме того, вы не хотите использовать пароль там, но какой-то ключ API, так что URL выглядит так:

/users/leethal?secret=da01930adfe82810092

Чтобы использовать имя пользователя вместо идентификатора, сделайте следующее:

# controller
@user = User.find_by_username!(params[:id])

# model
def to_param
  username
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...