假设您正在使用API,并且您想要很好的URL。例如,您希望提供基于作者查询文章的功能,可能还有排序。
标准
GET http://example.com/articles.php?author=5&sort=desc
我想这样做的RESTful方式可能是:
GET http://example.com/articles/all/author/5/sort/desc
我说错了吗?或者我的REST事情都错了吗?
答案 0 :(得分:7)
我担心你的问题确实错过了REST的观点。从纯粹的理论角度来看,从REST角度来看,这些网址中没有任何优势或劣势。在实践中,这些URL可能在不同的缓存中表现不同,当然服务器框架将以不同的方式解析它们。尽管您从框架开发人员那里听到了什么,但没有RESTful URL这样的东西。
从REST的角度来看,这两个URL只是可以解除引用的标识符。如果您想开始构建将受益于论文中描述的特性的REST API,您需要开始考虑在取消引用URL时返回的内容以及如何使用内容中嵌入的URL将内容链接在一起。
我意识到这并没有帮助你解决你认为是你的问题。我可以告诉你的是,REST的一个主要目的是允许你的URL完全在服务器的控制之下,并且可以在不影响你的客户端应用程序的情况下进行更改。因此,我的建议是使用您用于提供资源表示的框架来选择任何url结构。当然不要期待REST论文告诉你格式化URL的正确和错误方式,以及任何告诉你URL不是RESTful的人都会感到困惑。可能他们告诉你的是服务器框架,它们习惯于用于创建RESTful接口,需要以这种方式构建URL。
这不是你的URI看起来重要的事情,而是你用它做的事情。
答案 1 :(得分:3)
使用查询字符串并不比使用路径组件更多或更少RESTful。 URI Generic Syntax(RFC 3986,2005年1月)定义它们在识别资源方面同样重要。所以是的,正如其他人所指出的那样,REST并不重要。 (请注意,在废弃的RFC-3986 RFC 2396中,查询字符串不定义为识别资源,而是一串信息由资源解释。)
然而,URI设计很重要,因为作为URI命名空间的所有者(即URI将存在的域名的持有者),您希望URI具有长期存在性。正如wise men have stated earlier:酷URI不会改变!
使用查询字符串与路径组件的选择取决于您的资源的识别方式,以及如何在未来几年内识别它们。如果有一个突出的层次结构,那么它可能应该反映在URI中,至少如果该层次结构是相对永久的,并且事情不会一直移动。
同样重要的是要注意,实际的 URI仅对双方有意义:
相比之下,客户端应用程序通常不允许进行URI内省。因此,您选择的查询字符串与路径组件可归结为您认为可以忍受的内容从现在起十年(或100年)。
答案 2 :(得分:2)
你大多是对的。 REST api的关键是关注名词。
在这种情况下,名词all
做了什么?您是否希望您的API始终返回所有文章,除非您对其进行过滤?
我会使sort
成为查询字符串参数,此外,我会创建任何和所有过滤查询字符串参数。如果您在单击“最新”问题链接时查看Stack的实现方式,您将获得一个查询字符串来过滤问题。
或许类似于:
GET http://example.com/aritcles/authors/5?sort=desc
但也要考虑每个网址会发生什么:
GET http://example.com/aritcles/
可能会返回所有当前文章
GET http://example.com/aritcles/authors/
这个网址有什么作用?它会返回所有文章的所有作者,还是返回所有作者的所有文章(基本上与上述URL的功能相同。)
GET http://example.com/aritcles/authors/5/
可能会返回作者5的所有文章,还是会返回作者5的信息?
我可能会改为:
http://example.com/aritcles
返回所有文章
http://example.com/aritcles/5
返回作者5的所有文章
http://example.com/authors
返回所有作者
http://example.com/authors/5
返回作者5的信息
答案 3 :(得分:2)
Alan大部分都是对的,但他的网址有误导性。我相信正确的路线/网址应该反映以下行为:
[GET] http://domain.com/articles #=> returns all articles (index action)
[GET] http://domain.com/articles/5 #=> returns article ID 5 (show action)
[GET] http://domain.com/authors/#=> returns all authors (index action)
[GET] http://domain.com/authors/5 #=> returns author ID 5 (show action)
[GET] http://domain.com/authors/5/articles OR http://domain.com/articles/authors/5 #=> depending on the hierarchy of your routes (both belong to the index action)
祝你好运, DBA