【发布时间】:2015-07-26 04:31:06
【问题描述】:
假设我的 API 中有两种类型的资源:@987654321@ 和 class。这两者具有多对多的关系。
因此,我是否希望能够与以下端点进行交互:
-
/api/persons/1/classes-- 此人的课程列表 -
/api/classes/1/persons-- 此类人员的列表。
在我的代码中组织这些的最佳方式是什么?
以下是我想到的一些可能的选择,但我可以看到每个选择的缺点。 (使用 C#,但我的问题更普遍)。
PersonsController.cs
[Route("api/persons/{personId}/classes")]
[AcceptVerbs("GET")]
public List<SchoolClass> ListClassesForPerson(string personId)
{
//return result of PersonsService.ListClassesForPerson(personId)
}
在我的 ClassController.cs 中有相反的内容。
这种方法的缺点是,现在我有一个 PERSON 控制器和 PERSON 服务返回一个类列表...看起来很恶心。
另一种可能是:
PersonsController.cs
[Route("api/persons/{personId}/classes")]
[AcceptVerbs("GET")]
public List<SchoolClass> ListClassesForPerson(string personId)
{
//return result of ClassesService.ListClassesForPerson(personId)
}
但现在我正在从我的 PERSON 控制器访问 CLASS 服务,看起来也很恶心。
我想我已经决定路由 /api/persons/{personId}/classes 实际上应该由 ClassController.cs 类处理,即使它描述了一个人的资源......但我仍然不确定这是否是最好的做。
这种情况的最佳做法是什么?我错过了什么明显的东西吗?
【问题讨论】:
-
您是否考虑过映射端点,例如
/person-classes?另外,我希望您的两个端点在响应正文中都具有其他类型的 ID。也就是说,我希望对GET /classes的响应至少包含"persons": [ "/persons/6", "/persons/25" ]之类的内容,默认情况下或关闭查询参数。最后,你为什么用人而不是人?
标签: rest restful-url