你如何通过ID以外的东西获取RESTful资源?

时间:2009-01-30 00:48:16

标签: ruby-on-rails rest

在某些情况下,我需要通过ID以外的参数来查找对象。什么是正确的RESTful方式呢?

例如,我可能希望按Userusername找到password,因此严格的RESTful“GET /users/1”无效。

根据the Rails docs,这是获取资源所有实例的网址格式:“GET /users”。我可以添加参数:“GET /users?username=joe&password=topsecret”,但这会歪曲GET请求的官方目的。

2 个答案:

答案 0 :(得分:12)

“GET / users?username = joe& password = topsecret”,但这会歪曲GET请求的官方目的。“

不,它不会变态。这绝对是正确且RESTful的方式,并且是在http规范中检索动态结果的推荐方式。 REST不关心URL中的内容,只关注它是唯一的。对于所有REST架构关注,该页面的URL可以是http://3f778a9b8a7c778696e,只要这是达到目标的唯一方式,并且它不会在其他任何地方引导。

http定义用于返回动态结果的查询字符串协议。给定数据库的当前状态,您为应用程序提供的查询字符串应始终返回相同的结果。然后它将是RESTFUL。 URL美学与REST完全不同。

根据REST架构,GET请求的规则是它总是返回相同的结果(或者在相当长的时间内保持相同的结果,以便缓存工作),并且GET没有侧面效果。 GET需要是​​幂等的(总是返回相同的结果,无论你调用多少次)并且不会导致系统改变状态。那是 it

当然,您不必使用查询协议。您可以将参数放在正斜杠中,在分号之间,或者它可以是base64编码的GUID。这完全取决于你,只要遵循这些简单的规则。

答案 1 :(得分:2)

多个键不安宁,是吗?也许是/users/[username]?password=secret。此外,您不想在那里使用密码,而是使用某种API密钥,以便网址如下所示:

/users/leethal?secret=da01930adfe82810092

要使用用户名而不是id,请执行以下操作:

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

# model
def to_param
  username
end