为一对多关系暴露RESTful端点

11
考虑以下两个资源之间的关系:
  • 学院有许多教职员工
  • 教职员工隶属于一个学院
很明显,这里的教职员工不是一流资源。
现在我需要以下操作的终端点。
  • 在该学院中创建一个新的教职员工。一种可能的方法是进行两个操作。
    • 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。
有什么建议吗?

3
顺便说一下,我认为你应该在使用复数时保持一致 - 你在学院方面使用单数,而在系和领域方面使用复数。个人而言,我总是使用单数,因为我喜欢路径与资源名称匹配。你选择使用哪个形式并不太重要,但要保持一致。 - justAnotherUser
1个回答

6
我曾经在一篇文章中介绍了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
我认为你可以利用两种情况来最小化请求的数量:使用引用或提供内容。我的意思是,如果资源能够检测到(基于内容或自定义标头),则知道它是否只需要处理引用(仅附件)或内容(创建和附件)。
我认为多重基数(大学 ->系)可能会有以下几种请求:
  • 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。这种方法允许你在一个调用中创建元素,然后附加它们。它允许在元素上进行处理。
希望我解释清楚并且有所帮助, Thierry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接