Как вы получаете RESTful-ресурс чем-то другим, кроме ID?
Могут быть ситуации, когда мне нужно будет найти объект по параметрам, отличным от ID. Какой правильный RESTful способ сделать это?
Например, я мог бы хотеть найти User
от username
а также password
так что строго отдыхатьGET /users/1
"не будет работать.
Согласно документации Rails, это шаблон URL для получения всех экземпляров ресурса: "GET /users
Msgstr "Я мог бы добавить параметры к этому:"GET /users?username=joe&password=topsecret
", но это исказило бы официальную цель запроса GET.
2 ответа
"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. Это зависит только от вас, если он следует этим простым правилам.
Несколько ключей не успокаивает, не так ли? возможно /users/[username]?password=secret
, Кроме того, вы не хотите использовать пароль там, но какой-то ключ API, так что URL выглядит так:
/users/leethal?secret=da01930adfe82810092
Чтобы использовать имя пользователя вместо идентификатора, сделайте это:
# controller
@user = User.find_by_username!(params[:id])
# model
def to_param
username
end