api - 对于 HTTP POST 使用 URI 路径变量怎么样?

标签 api http rest post uri

我进行了很多搜索,但找不到有关我的条件的问题的正确答案。
我正在构建一个 REST API,对我来说这似乎是一个边界线案例,如下所示:

-我正在处理两个实体,用户和角色。一个用户可以分配多个角色。
-要将角色分配给用户,该角色必须已存在于数据库中。
-要将角色分配给用户,唯一需要的是角色的“代码”,即一个短字符串。
-现在使用的uri路径模板是:
--用户: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/用户/U001/角色/R001

预先感谢大家的帮助。

最佳答案

将角色放入 URI 中没有任何问题。你的直觉是正确的。我会这样做。

放置:locahost:8080/api/users/{userid}/role/{roleId}

原因如下。

第一:PUT 动词是幂等。换句话说(直接取自规范)

... the side-effects of N > 0 identical requests is the same as for a single request.

这就是我认为您在这方面想要的。您不希望每个用户和角色实例在状态存储中都有多个记录。用户应该放心地发出相同的 PUT 请求,而不会对系统产生不利影响(添加重复记录)。

当使用 POST 执行相同的操作时,我希望为每个请求创建一条新记录。

第二:PUT 动词应该标识特定资源。 (直接取自规范)

... PUT request identifies the entity enclosed with the request -- the user agent knows what URI is intended and the server MUST NOT attempt to apply the request to some other resource. If the server desires that the request be applied to a different URI, it MUST send a 301 (Moved Permanently) response; the user agent MAY then make its own decision regarding whether or not to redirect the request.

如果角色 R102 变得过时并且 R104 成为首选怎么办?返回带有 header 的 301(永久移动)(位置:localhost:8080/api/users/{userid}/role/R104)。

最后:当一切顺利时。创建时返回 201(已创建),对同一 URI 的每个后续请求返回 200(无内容)。如果他们提供的角色不在系统中,则返回 501(未实现)。

关于api - 对于 HTTP POST 使用 URI 路径变量怎么样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9657616/

相关文章:

python - 使用 tastypie 从 PointField 返回纬度和经度值

c# - 使用 BART 的 API 通过 RestSharp C# 获取响应

python - 谷歌 Api 视觉, "before_request"错误

javascript - 寻找一个独立的库来处理 Javascript 个人容器上的 HTTP cookie

java - 使用 PUT 请求 Java 将文本文件上传到 Swagger

android - 如果我删除旧的 Android API 级别并只保留最新的级别,会发生什么情况

azure - 为什么 Azure APIM 重定向到后端服务 URL?

javascript - HTTP 长轮询 - 超时最佳实践

rest - yii2 rest api 实现自定义操作

rest - OneDrive REST API