为一对多关系公开 RESTful 个端点
Exposing RESTful endpoints for a one to many relationships
考虑以下两个资源之间的关系
- 学院有很多院系
- 教师属于学院
显然教员不是这里的第一个 class 资源。
现在我需要用于以下操作的端点。
- 在这个农场的这所大学里创建一个新教员。在两个操作中执行此操作的一种可能方法。
POST /faculties/
PUT /college/1/faculties
- 从这所学院中删除一名教师。又是两个操作
GET /college/1/faculties
:相关院系列表。每个都将包含一个自我 url,例如 /faculties/1
。
DELETE /college/1/faculties/1
: url 看起来更好 但是如何暴露这个 url?
- 在该学院下添加一个或多个院系。
PUT /college/1/faculties
接受该学院的完整院系列表。
- 完全删除该特定扇区。
DELETE /sectors/1
:看起来不错但需要照顾/faculties/1/sectors
的缓存。
在这种情况下,更好的方法是什么?我读过有关公开会员资源的信息,但采用这种方法,如果一所大学有 10 个院系,则需要 10 个单独的 http 调用才能从会员中获取所有这些资源。
此外,这只是完整关系树的一小部分。为了进一步扩展,假设系统有
- 学院有很多系
- 部门有很多实验室等等。
此外,在 RESTful 架构中,客户端永远不应填充 URL。
有什么建议吗?
我以前写过一篇post关于OData如何实现这些方面(特性"navigation properties")。看到这个 link:https://templth.wordpress.com/2014/12/08/updating-data-links-of-odata-v4-services-with-olingo/.
另一个 link 也可以给你一些有趣的提示,因为它在末尾描述了 URL 和相应的有效负载:http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-v4/entity-relations-in-odata-v4.
我认为您可以利用两种情况来最大限度地减少请求数量:使用参考资料或提供内容。我的意思是,如果资源检测到(基于内容或自定义 header)发送的内容,那么它知道它是否只需要处理引用(仅附件)或内容(创建和附件)。
我会看到以下可能的多基数请求(大学 -> 院系):
POST /faculties/
: 添加一个没有附属于大学的教员
POST /college/1/faculties
: 将一个教员附加到一个学院,如果不存在则最终创建它(基于发送的内容)
DELETE /college/1/faculties/?ref=/faculties/1
将教员从大学中分离出来
您还可以考虑将对大学的引用放在教职员工中(请求 POST /faculties
)。所以你可以在创建过程中附加元素。
否则这样做 PUT /college/1/faculties
旨在替换整个表示,以便所有附属于特定学院的院系。
您也可以使用 POST 或 PATCH 方法来最小化请求的数量。您可以查看这些答案以获取更多详细信息:REST API - Bulk Create or Update in single request and How to Update a REST Resource Collection。这种方法允许您在一次调用中创建元素,然后附加它们。它允许对元素进行收集处理。
希望我说的很清楚,对你有帮助,
蒂埃里
考虑以下两个资源之间的关系
- 学院有很多院系
- 教师属于学院
显然教员不是这里的第一个 class 资源。
现在我需要用于以下操作的端点。
- 在这个农场的这所大学里创建一个新教员。在两个操作中执行此操作的一种可能方法。
POST /faculties/
PUT /college/1/faculties
- 从这所学院中删除一名教师。又是两个操作
GET /college/1/faculties
:相关院系列表。每个都将包含一个自我 url,例如/faculties/1
。DELETE /college/1/faculties/1
: url 看起来更好 但是如何暴露这个 url?
- 在该学院下添加一个或多个院系。
PUT /college/1/faculties
接受该学院的完整院系列表。
- 完全删除该特定扇区。
DELETE /sectors/1
:看起来不错但需要照顾/faculties/1/sectors
的缓存。
在这种情况下,更好的方法是什么?我读过有关公开会员资源的信息,但采用这种方法,如果一所大学有 10 个院系,则需要 10 个单独的 http 调用才能从会员中获取所有这些资源。
此外,这只是完整关系树的一小部分。为了进一步扩展,假设系统有
- 学院有很多系
- 部门有很多实验室等等。
此外,在 RESTful 架构中,客户端永远不应填充 URL。
有什么建议吗?
我以前写过一篇post关于OData如何实现这些方面(特性"navigation properties")。看到这个 link:https://templth.wordpress.com/2014/12/08/updating-data-links-of-odata-v4-services-with-olingo/.
另一个 link 也可以给你一些有趣的提示,因为它在末尾描述了 URL 和相应的有效负载:http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-v4/entity-relations-in-odata-v4.
我认为您可以利用两种情况来最大限度地减少请求数量:使用参考资料或提供内容。我的意思是,如果资源检测到(基于内容或自定义 header)发送的内容,那么它知道它是否只需要处理引用(仅附件)或内容(创建和附件)。
我会看到以下可能的多基数请求(大学 -> 院系):
POST /faculties/
: 添加一个没有附属于大学的教员POST /college/1/faculties
: 将一个教员附加到一个学院,如果不存在则最终创建它(基于发送的内容)DELETE /college/1/faculties/?ref=/faculties/1
将教员从大学中分离出来
您还可以考虑将对大学的引用放在教职员工中(请求 POST /faculties
)。所以你可以在创建过程中附加元素。
否则这样做 PUT /college/1/faculties
旨在替换整个表示,以便所有附属于特定学院的院系。
您也可以使用 POST 或 PATCH 方法来最小化请求的数量。您可以查看这些答案以获取更多详细信息:REST API - Bulk Create or Update in single request and How to Update a REST Resource Collection。这种方法允许您在一次调用中创建元素,然后附加它们。它允许对元素进行收集处理。
希望我说的很清楚,对你有帮助, 蒂埃里