正确的ReST URI设计

时间:2010-11-09 15:26:06

标签: rest

我有以下(假设的)情景:

申请在学校的课堂上报告学生。我有3桌学校,班级,学生。班级有一个FK school_id,学生有一个FK class_id。

我已将所有实体设置好并准备就绪,我即将通过Rest界面公开它们。

我的URI应该是这样的: 学校 - 学校名单
学校/ {id} - 特定学校
学校/ {id} /班级 - 班级列表
学校/ {id} / classes / {id} - 特定班级
学校/ {id} / classes / {id} /学生 - 列出学生
学校/ {id} / classes / {id} / student / {id} - 特定学生

即使在特定学生的情况下,我也会忽略我将忽略学校ID和班级ID,因为我关心的所有问题都是学生ID。

我应该: 学校/学生/ {id} - 针对特定学生。

2 个答案:

答案 0 :(得分:4)

从多个位置公开资源没有问题(尽管如果有多个位置*,最好指定canonical url。)

因此,提供以下所有URI可能是有意义的:

lists:

student
classes/{id}/student
schools/{id}/classes/{id}/student

specific:

student/{id}
classes/{id}/student/{id}
schools/{id}/classes/{id}/student/{id}

在您的情况下,实体之间的关系本身不是实体。如果是这种情况(例如,如果您的资源类 - 学生具有指定学生在课程中的时间长度的属性)那么包含classstudent ID的URI会变得更多这很重要,因为它们提供了揭示关系本身属性的好地方。

*最好向客户提供规范网址,您可以将其作为响应标头中“Content-Location”的值发送。

答案 1 :(得分:1)

此外,具有使用复数/单数名称的约定是有用的。 有些人喜欢单数名称,有些人(比如Ruby人)使用两者和转换工具。 例如,在Ian的回答student列表中,网址必须为students