【发布时间】:2019-06-21 10:18:57
【问题描述】:
我正在为多对多关系定义一条休息路径。 我想获取作为公司客人的用户列表。 下面的路径够吗?
/api/v1/users/companies/{companyId}/guests
因为我把它放在了 UserController 中所以它不能是
/api/v1/companies/{companyId}/guests
你有什么建议吗?
【问题讨论】:
我正在为多对多关系定义一条休息路径。 我想获取作为公司客人的用户列表。 下面的路径够吗?
/api/v1/users/companies/{companyId}/guests
因为我把它放在了 UserController 中所以它不能是
/api/v1/companies/{companyId}/guests
你有什么建议吗?
【问题讨论】:
我本来是想写评论的,但是太长了,所以我写了一个答案。
首先,REST 是一种架构风格,而不是用于设计 URI 的食谱。 REST 不强制执行任何 URI 设计(只要它符合 RFC 3986),完全由您来选择更好地识别您的资源的 URI。
你有什么建议吗?
这个问题的答案往往几乎完全基于意见,而不是事实、参考资料或特定专业知识。您将从这一点读到的是我的个人意见。
如果 guests 和 companies 资源可以独立管理,我会使用以下映射:
/companies
/guests
然后您可以使用 查询参数 来过滤给定公司的客人:
GET /guests?company={id} HTTP/1.1
Host: example.org
要为给定公司创建 guest 资源,您可以使用:
POST /guests HTTP/1.1
Host: example.org
Content-Type: application/json
{
"name": "John Appleseed",
"companyId": 1
}
【讨论】:
REST 不关心您对资源标识符使用什么拼写,只要它们与RFC 3986 中定义的生产规则一致。
/api/v1/users/companies/{companyId}/guests
没关系
/api/v1/companies/{companyId}/guests
这样也好。
/d4158568-c40f-4c51-93cd-25642f6f42e2
那也是。
/api/v1/companies/guests?companyId={companyId}
在网络上,您可能更有可能看到这样的标识符;表单是一种使客户端能够提供数据的有用方式,HTML 具有从表单中的数据创建 URI 的生产规则。当然,HTTP 也有一些机制允许您redirect 客户端将注意力从一个 URI 转移到另一个 URI,因此您不必将标识符限制为适合特定客户端的标识符。
【讨论】: