我搜索了很多但是我无法找到关于我的条件的问题的正确答案
我正在构建一个REST API,这个案例对我来说似乎是一个边界线,如下所示:
- 我正在处理两个实体,用户和角色。用户可以分配多个角色
- 要为用户分配角色,角色必须已存在于数据库中
- 要为用户分配角色,唯一需要的是角色的“代码”,即短字符串。
- 现在使用的uri路径模板是:
--Users:localhost:8080 / api / users
- 给予用户:localhost:8080 / api / users / {userId}
- 给定用户的角色:localhost:8080 / api / users / {userId} / roles
现在,要将给定用户与给定角色“链接”,我会想到两个选项
- 第一个是在任何场景中听起来都是最佳实践的,在体内发送帖子数据,也许是作为JSON。
- 另一个,通过uri和空身发送它。例如,要将具有ID U001的用户与角色R001链接,必须发布到以下uri,在正文中不发送任何数据:localhost:8080 / api / users / U001 / roles / R001
问题是我不介意使用第一个选项,它似乎是最好的和最正确的选项,但在这种特殊情况下,我不确定发送一个几乎空的身体是否更好(因为它只保存角色id,一个非常短的字符串)将其发布到'localhost:8080 / api / users / U001 / roles'或者跳过正文,只是通过uri发送角色id作为路径参数,如localhost:8080 / api / users / U001 / roles / R001
提前感谢大家的帮助。
答案 0 :(得分:3)
将角色放在URI中没有任何问题。你的直觉是在正确的轨道上。我这样做。
PUT:locahost:8080 / api / users / {userid} / role / {roleId}
这就是原因。
FIRST:PUT动词幂等。换句话说(直接从规范中获取)
...... N的副作用> 0个相同的请求与单个请求相同。
在这方面我认为你想要的是什么。对于每个用户和实例,您不希望状态存储中有多条记录。角色。用户应该放心地制作相同的PUT请求而不会对系统产生不利影响(添加重复记录)。
当使用POST执行相同的操作时,我希望为每个请求创建一条新记录。
SECOND:PUT动词应该识别特定资源。 (直接从规范中获取)
... PUT请求标识请求附带的实体 - 用户代理知道预期的URI,服务器不得尝试将请求应用于其他资源。如果服务器希望将请求应用于不同的URI, 必须发送301(永久移动)响应;然后,用户代理可以自己决定是否重定向请求。
如果角色R102过时并且R104是首选,该怎么办?使用HEADER返回301(永久移动)(位置:localhost:8080 / api / users / {userid} / role / R104)。
最后:一切顺利的时候。创建时返回201(已创建),并在对同一URI的每个后续请求中返回200(无内容)。如果他们提供的系统不在系统中,则返回501(未实现)。
答案 1 :(得分:0)
嗯 - 在这种情况下 - 带有302的POST可能有点乱。
为什么不建议使用非常简单的'PUT'/'DELETE'?
简单; 20X意味着成功,可能有30X表示它已经存在 - 还有其他任何一个失败了吗?