在REST中实现PUT的正确方法是什么?

时间:2019-03-04 20:15:56

标签: rest http url httpverbs

我可以在/ user / {username}网址上获取用户的数据,响应为

from itertools import combinations

for pair in combinations([a, b, c], 2):
    assert np.array_equal(pair[0], pair[1])

在我的实现中,如果您将数据放在/ user / {username} URL上,则后端将使用指定的用户名创建或更新用户。

当后端在URL中获得用户名(如 / user / foo 和http有效负载)时,正确的处理方式是什么?

{
  "id" : 1,
  "username" : "testuser",
  "email" : "test@example.org"
}

我应该返回 409-冲突,还是应该使用有效负载中的用户名创建或更新用户?

1 个答案:

答案 0 :(得分:1)

在最初的REST概念中,URL应该实际上是URI-资源标识符,也就是说,可以唯一地标识系统中的 user 实体。

因此,如果模型中的username唯一且不可能有2个同名用户,则可以在资源中使用username标识符 URL。 示例-/user/foo

但是,如果两个具有不同id的用户可以拥有相同的username,那么根据 strict REST的规定,您不能使用username作为一部分的URL-它将不再是REST,仅是一些在PUT请求的有效负载中接受JSON的网络服务。

长话短说:

1)如果username不是系统中用户的唯一标识符-请勿在URL中使用它,请改用id,例如,您提到的URL将是{{1} }

2)如果/user/1是系统中的唯一标识符-那么您可以拥有username

================================================ ===========================
在这两种情况下,您都需要进行完整性检查,以确保有效载荷中的值对应于URL中的值:
1),请检查URL中的/user/foo是否与有效负载中的相同
对于2),请检查URL中的id是否与有效负载中的相同

如果不一致,我将返回状态username-该请求的格式正确,但由于语义错误而无法遵循。 确切描述了语义上的不一致-JSON有效负载的结构是正确的,但是URL和有效负载中的语义HTTP 422 Unprocessable Entityid不匹配。