我的RESTful API始终具有身份验证,因此所有呼叫都会针对特定用户进行身份验证。
哪种是基于HTTP协议的更好的REST设计URL? 请记住,用户ID 3已通过基本的http auth / digest进行身份验证。
http://server.com/users/3/widgets/(返回用户ID 3的所有小部件)
http://server.com/users/3/widgets/13(返回小部件ID 13)
或:
http://server.com/widgets/(返回用户ID 3的所有小部件)
http://server.com//widgets/13(返回小部件ID 13)
总是拥有像http://server.com/users/3/widgets/
这样的唯一网址更好吗,即使知道只有用户#3才会访问它?在http://server.com/users/3/widgets/
答案 0 :(得分:2)
我肯定会推荐第一个选项。如果您选择第二个并且在某个时刻您决定要允许缓存,那么您必须确保您的vary头指定了授权标头上的表示形式。如果您使用过期的身份验证令牌,这可能会很痛苦。
这也意味着如果您想让用户看到其他用户的小部件,您可以继续使用缓存。
答案 1 :(得分:0)
我会选择第一个,因为它确实完全指定了资源。
答案 2 :(得分:0)
REST在技术上应该是无状态的,所以更“正确”的实现将是你列出的第一种方式。
但是,我会做的事情与您建议第一种方法的方式略有不同 - 用户会根据用户的具体情况更改特定小部件更改的信息吗?如果没有,您可能想尝试这个:
http://server.com/users/3/widgets/ (Returns all widgets for user id 3)
http://server.com/widgets/13 (Returns widget id 13)
两全其美。适当的“REST-ful”实现,但是当涉及到特定的小部件时,当前用户并不重要。这样,您的客户端也可以更轻松地传递对单个小部件的查询 - 而无需自己更新查询。如果客户端不应该有权查看该特定小部件,那么使用您已经进行的身份验证就不会难以防范。
我也基于这样的假设,即小部件列表可能因客户端而异 - 如果不是这样,并且所有客户端都将看到相同的小部件列表,则没有理由通过用户,所以选择第二种方式。