用于在多对多关系中检索结果的 REST 端点设计

REST endpoint design for retrieving results in many to many relationship

我已经阅读了许多关于安心设计多对多关系的其他帖子;但是,我无法完全找到我正在寻找的答案。

基本上,我在数据库中有 2 个 table 和另一个连接这 2 个 table 的多对多 table。 为简单起见,我们称它们为:


我有两个问题:

1) 我应该如何获取 CourseInstructor 中的所有条目 table.

GET /courses/instructors是否正确? (或 GET /instructors/courses 或两者)

或者我应该有一个名为 /coursesinstructors 的单独端点


2) 我还希望能够通过传入 CourseName 来获取 CourseInstructor table 中的所有行。

通常我想我会这样做,/courses?name=coursename 如果我正在搜索课程。而且,我可能会使用端点 /courses/{courseId}/instructors/{instructorId} 在多对多 table.

中搜索特定条目

因此,我很好奇这样的东西是否可行:/courses?name=coursename/instructors(这甚至可能吗?)

另一种选择是使用另一个名为 /coursesinstructors 的端点,我可以使 /courseinstructor?name=coursename 获得结果。

或者我应该通过以下方式调用 2 次来获取结果: - 通过/courses?name=coursename获取id - 并跟随 courses/{id}/instructors

除了我上面提出的建议和解决方案之外,我对任何其他建议和解决方案持开放态度(不确定我的解决方案是否正确)。

对于第一种情况,这实际上取决于您的用例是什么。 GET /courses/instructors 意味着(只)找回讲师,所以我个人只选择 GET /coursesembed 讲师。

至于第二种情况,/courses?name=coursename 应该足够好(再加上 /courses/{courseId}/instructors/{instructorId} 以深入到特定条目)。 2 次调用是另一个有效选项。然而,根据 RFC 3986.

,像 /courses?name=coursename/instructors 这样的 URL 似乎无效

如果您确实需要 (1),所有课程-教师配对的完整转储,那么我认为您最好的选择是支持

GET /course-instructors
GET /course-instructors?courseName=whatever

然后您可以 link 或嵌入课程和讲师。

{
    "course": "/courses/12",
    "instructor": "/instructors/54"
}

{
    "course": {
        "name": "Political Science",
        ...
    },
    "instructor": {
        "name": "Hober Mallow",
        ...
    }
}

您 return 取决于客户的需求。也许您 return 缩写信息加上 link 到完整表示,或者 return 只是 link 是可以的,因为课程和讲师(应该是!)高度可缓存。

顺便说一句,我认为您最好停止考虑数据库如何存储数据,而是考虑客户需要从您的 API.