【发布时间】:2016-10-13 14:25:06
【问题描述】:
我正在设计一个 RESTful API,但遇到了与子资源相关的问题。
我看到其他 API 使用完整 URL 来操作子资源。以Company has Departments和Department has Employees为例。
一开始我想实现所有可能的 URL。结果如下:
方法 A
01. ### COMPANY URLS ###
02. DELETE /companies/{companyId}
03. GET /companies/{companyId}
04. POST /companies
05. PUT /companies/{companyId}
06.
07. ### DEPARTMENT URLS ###
08. DELETE /companies/{companyId}/departments/{departmentId}
09. GET /companies/{companyId}/departments/{departmentId}
10. POST /companies/{companyId}/departments
11. PUT /companies/{companyId}/departments/{departmentId}
12. DELETE /departments/{departmentId}
13. GET /departments/{departmentId}
14. PUT /departments/{departmentId}
15.
16. ### EMPLOYEE URLS ###
17. DELETE /companies/{companyId}/departments/{departmentId}/employees/{employeeId}
18. GET /companies/{companyId}/departments/{departmentId}/employees/{employeeId}
19. POST /companies/{companyId}/departments/{departmentId}/employees
20. PUT /companies/{companyId}/departments/{departmentId}/employees/{employeeId}
21. DELETE /departments/{departmentId}/employees/{employeeId}
22. GET /departments/{departmentId}/employees/{employeeId}
23. POST /departments/{departmentId}/employees
24. PUT /departments/{departmentId}/employees/{employeeId}
25. DELETE /employees/{employeeId}
26. GET /employees/{employeeId}
27. PUT /employees/{employeeId}
如您所见,有许多 URL 可以做同样的事情。示例:08 与 12 重复; 09 与 13 重复; 17 与 21 和 25 重复...
我想删除重复但保持一致性。因此,重新设计 API 时要牢记原则sup-resources are fine but sub-sub-resources are not。结果如下:
方法 B
01. ### COMPANY URLS ###
02. DELETE /companies/{companyId}
03. GET /companies/{companyId}
04. POST /companies
05. PUT /companies/{companyId}
06.
07. ### DEPARTMENT URLS ###
08. DELETE /departments/{departmentId}
09. GET /departments/{departmentId}
10. GET /companies/{companyId}/departments
11. POST /companies/{companyId}/departments
12. PUT /departments/{departmentId}
13.
14. ### EMPLOYEE URLS ###
15. DELETE /employees/{employeeId}
16. GET /employees/{employeeId}
17. GET /departments/{departmentId}/employees
18. POST /departments/{departmentId}/employees
19. PUT /employees/{employeeId}
我的问题
第一季度。 方法 B 是否被视为 RESTful? (我假设是的)
第二季度。假设还提供了文档,我应该考虑方法 B 的陷阱吗?
如果您按照方法 B 指向其他 API,则会获得奖励积分。
编辑
Elad Tabak 提出了很好的见解。
我喜欢使用方法 B 的一些 API:
https://developers.google.com/youtube/v3/docs/
【问题讨论】:
-
这有点太宽泛了,Q3 和 4 基本上是邀请转储 Web 服务设计的书。你应该问一个问题,而不是问卷。您的核心问题似乎是 Q1 + Q2 的组合。
-
感谢 Gimby,同意,它非常广泛,我最关心 Q1 和 Q2。
标签: rest restful-url