我正在设计一个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并遵循一个原则上级资源没问题,但下级资源不行
。这导致以下结果:
方法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}
我的问题
Q1. 是否认为Approach B符合RESTful?(我认为是)
Q2. 假设提供了文档,是否应考虑使用Approach B的缺陷?
如果您能指出其他遵循Approach B的API,则可获得额外积分。
编辑
Elad Tabak
提供了有见地的观点。
我发现一些使用Approach B的API:
https://developers.google.com/youtube/v3/docs/