为一对多关系公开RESTful端点

时间:2015-03-24 15:55:06

标签: rest restful-architecture apiblueprint

考虑两个资源之间的以下关系

  • 大学有很多学院
  • 教师属于学院

显然,Faculty不是这里的一流资源。

现在我需要端点来执行以下操作。

  • 在这所农场建立一个新的教师队伍。在两个操作中执行此操作的一种可能方法。
    • POST /faculties/
    • PUT /college/1/faculties
  • 从这所大学中删除一名教员。再两次操作
    • GET /college/1/faculties:相关院系列表。每个都会包含一个类似/faculties/1的自我网址。
    • DELETE /college/1/faculties/1:网址看起来更好但是如何公开这个网址?
  • 在该学院下添加一个或多个院系。
    • PUT /college/1/faculties接受这所大学院系的完整名单。
  • 完全删除该特定部门。
    • DELETE /sectors/1:看起来不错但需要处理/faculties/1/sectors的缓存。

在这种情况下,更好的方法是什么?我已经读过有关公开会员资源的内容,但是如果有一个大学有10个院系,那么需要10个单独的http电话才能从会员资格中获得所有这些资源。

此外,这只是完整关系树的一小部分。为了进一步扩展,请说系统有

  • 学院有很多部门
  • 部门有很多实验室等。

此外,在RESTful架构中,客户端永远不应填充URL。

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

我过去曾写过一篇关于OData如何实现这些方面的帖子(功能"导航属性")。请看这个链接:https://templth.wordpress.com/2014/12/08/updating-data-links-of-odata-v4-services-with-olingo/

这个其他链接也可以为您提供一些有趣的提示,因为它最后描述了URL和相应的有效负载:http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-v4/entity-relations-in-odata-v4

我认为您可以利用两种情况来最小化请求数量:使用引用或提供内容。我的意思是,如果资源检测到(基于内容或自定义标头)发送的内容,那么它知道它是否只需要处理引用(仅附件)或内容(创建和附件)。

我会看到以下可能的多基数请求(大学 - > faculties):

  • 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 requestHow to Update a REST Resource Collection。这种方法允许您在一个调用中创建元素,然后附加它们。它允许收集元素的处理。

希望我很清楚它对你有帮助, 亨利