Restful URI 设计
Restful URI design
假设一个应用程序的域结构如下:
- 有一个名为 Department 的域对象。
- 有一个名为 Student 的域对象。
- 有一个名为 Paper 的域对象。
- Student 和Department 之间的关系是多对多的。
- 学生可以为自己或他人发表(创建)论文
特定部门。
- 一个学生可以查看他发表的所有论文
他本人和他所属的部门(后者包括
同系其他学生发表的论文
作为给定的学生)
我认为 restful uri 设计应该是这样的
- 学生为自己创建(POST)白皮书:
/students/{studentid}/papers
- 学生创造了(POST)一个白色
特定部门的论文
/students/{studentid}/departments/{departmentid}/papers
- 获取他为自己发表的所有学生论文
/students/{studentid}/papers/self
- 获取他为自己发表的所有学生论文,包括论文
他所属的部门
/students/{studentid}/papers
- 点号 1 和点 2 的类似获取请求。
达到上述终点的另一种方法是(仅考虑点 1 和 2):
/students/{studentid}/papers
然后在请求正文中传递departmentid。应用程序将检查请求中是否存在 departmentId。如果它不为空,那么它将假定这篇论文是针对给定的 departmentid 发表的,否则是针对学生本人的。
以上哪种方法更好?
由于 departmentid
是资源标识方式的一部分,因此它必须是 URL 的一部分。放到request body中是违反REST原则的。
此 link 可以帮助您设计 RESTful 服务:https://templth.wordpress.com/2014/12/15/designing-a-web-api/。
此外,以下是我对您的网址的评论:
- 标识您的资源的所有内容都应在资源路径中(例如
departmentid
)
- 关于关系,我们需要确定哪些 URL 将处理引用。例如,
/students/{studentid}/departments/{departmentid}/papers
将允许将现有论文附加到部门或创建新论文并将其附加到部门
- 我不明白这个 url:
/students/{studentid}/papers/self
尤其是令牌 self
。 self
是否指的是当前经过身份验证的用户?如果是这样,我认为应该使用查询参数,因为它并不真正对应于资源...事实上,您更愿意使用查询参数进行列表过滤
希望对你有帮助,
蒂埃里
假设一个应用程序的域结构如下:
- 有一个名为 Department 的域对象。
- 有一个名为 Student 的域对象。
- 有一个名为 Paper 的域对象。
- Student 和Department 之间的关系是多对多的。
- 学生可以为自己或他人发表(创建)论文 特定部门。
- 一个学生可以查看他发表的所有论文 他本人和他所属的部门(后者包括 同系其他学生发表的论文 作为给定的学生)
我认为 restful uri 设计应该是这样的
- 学生为自己创建(POST)白皮书:
/students/{studentid}/papers - 学生创造了(POST)一个白色
特定部门的论文
/students/{studentid}/departments/{departmentid}/papers - 获取他为自己发表的所有学生论文 /students/{studentid}/papers/self
- 获取他为自己发表的所有学生论文,包括论文 他所属的部门 /students/{studentid}/papers
- 点号 1 和点 2 的类似获取请求。
达到上述终点的另一种方法是(仅考虑点 1 和 2):
/students/{studentid}/papers
然后在请求正文中传递departmentid。应用程序将检查请求中是否存在 departmentId。如果它不为空,那么它将假定这篇论文是针对给定的 departmentid 发表的,否则是针对学生本人的。
以上哪种方法更好?
由于 departmentid
是资源标识方式的一部分,因此它必须是 URL 的一部分。放到request body中是违反REST原则的。
此 link 可以帮助您设计 RESTful 服务:https://templth.wordpress.com/2014/12/15/designing-a-web-api/。
此外,以下是我对您的网址的评论:
- 标识您的资源的所有内容都应在资源路径中(例如
departmentid
) - 关于关系,我们需要确定哪些 URL 将处理引用。例如,
/students/{studentid}/departments/{departmentid}/papers
将允许将现有论文附加到部门或创建新论文并将其附加到部门 - 我不明白这个 url:
/students/{studentid}/papers/self
尤其是令牌self
。self
是否指的是当前经过身份验证的用户?如果是这样,我认为应该使用查询参数,因为它并不真正对应于资源...事实上,您更愿意使用查询参数进行列表过滤
希望对你有帮助, 蒂埃里