在某些情况下,我需要通过ID以外的参数来查找对象。什么是正确的RESTful方式呢?
例如,我可能希望按User
和username
找到password
,因此严格的RESTful“GET /users/1
”无效。
根据the Rails docs,这是获取资源所有实例的网址格式:“GET /users
”。我可以添加参数:“GET /users?username=joe&password=topsecret
”,但这会歪曲GET请求的官方目的。
答案 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