Как вы получаете RESTful-ресурс чем-то другим, кроме ID?

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

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

Согласно документации Rails, это шаблон URL для получения всех экземпляров ресурса: "GET /usersMsgstr "Я мог бы добавить параметры к этому:"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
Другие вопросы по тегам