URL的外观与REST无关。什么都可以。它实际上是一个“实现细节”。因此就像您如何命名变量一样。它们所必须的是独特且耐用的。
不要为此浪费太多时间,只需做出选择并坚持下去/保持一致即可。例如,如果您使用层次结构,则将对所有资源进行处理。如果使用查询参数...等,就像代码中的命名约定一样。
为什么这样 ?据我所知,“ RESTful” API是可浏览的(您知道...“作为应用程序状态引擎的超媒体”),因此API客户端不会在乎您的URL是什么,只要它们是有效(没有SEO,没有人需要阅读这些“友好的url”,除了可能用于调试...)
REST API中URL的美观程度/可理解性只是作为API开发人员(而不是API客户端)引起您的兴趣,而不像您代码中的变量名一样。
最重要的是,您的API客户端知道如何解释您的媒体类型。例如,它知道:
- 您的媒体类型具有links属性,其中列出了可用/相关的链接。
- 每个链接都由一种关系标识(就像浏览器知道link [rel =“ stylesheet”]表示其样式表一样,或者rel = favico是指向收藏夹的链接...)
- 并知道这些关系的含义(“公司”表示公司列表,“搜索”表示用于在资源列表上进行搜索的模板化网址,“部门”表示当前资源的部门)
下面是一个HTTP交换示例(由于使用起来更容易,所以它们在yaml中):
请求
GET / HTTP/1.1
Host: api.acme.io
Accept: text/yaml, text/acme-mediatype+yaml
响应:指向主要资源(公司,人员等)的链接的列表。
HTTP/1.1 200 OK
Date: Tue, 05 Apr 2016 15:04:00 GMT
Last-Modified: Tue, 05 Apr 2016 00:00:00 GMT
Content-Type: text/acme-mediatype+yaml
# body: this is your API's entrypoint (like a homepage)
links:
# could be some random path https://api.acme.local/modskmklmkdsml
# the only thing the API client cares about is the key (or rel) "companies"
companies: https://api.acme.local/companies
people: https://api.acme.local/people
请求:链接到公司(使用以前的响应的body.links.companies)
GET /companies HTTP/1.1
Host: api.acme.local
Accept: text/yaml, text/acme-mediatype+yaml
响应:公司的部分列表(在项目下),资源包含相关链接,例如用于获取下一对公司的链接(body.links.next)和用于搜索的其他(模板化)链接(body.links.search)
HTTP/1.1 200 OK
Date: Tue, 05 Apr 2016 15:06:00 GMT
Last-Modified: Tue, 05 Apr 2016 00:00:00 GMT
Content-Type: text/acme-mediatype+yaml
# body: representation of a list of companies
links:
# link to the next page
next: https://api.acme.local/companies?page=2
# templated link for search
search: https://api.acme.local/companies?query={query}
# you could provide available actions related to this resource
actions:
add:
href: https://api.acme.local/companies
method: POST
items:
- name: company1
links:
self: https://api.acme.local/companies/8er13eo
# and here is the link to departments
# again the client only cares about the key department
department: https://api.acme.local/companies/8er13eo/departments
- name: company2
links:
self: https://api.acme.local/companies/9r13d4l
# or could be in some other location !
department: https://api2.acme.local/departments?company=8er13eo
因此,正如您所看到的,如果您使用链接/关系方式,那么构造URL路径部分的方式对您的API客户端没有任何价值。并且,如果您将URL的结构作为文档传达给客户端,那么您就没有使用REST(或者至少不是“ Richardson成熟度模型 ”的Level 3 )。