资源表示不完整的 PUT 预期的标准行为是什么?
例如,我有一个User
at ,/api/users/1
它由下面的 HAL json 表示:
{'id': 1,
'username': 'joedoe',
'email': 'joe@doe.com',
'password_hash': '9039dmk38f84uf4029i339kf32f0932i',
'last_visit': '2013-11-04 21:09:01',
'public': true,
'_links': {'self': {'href': 'http://foo.bar.com/api/users/1'}}
}
然后,我发出 PUT 请求来更改username
和email
,但表示缺少其他属性:
PUT /api/users/1
{'username': 'joeydoey',
'email': 'joey@doey.com'}
到目前为止,我一直认为这应该被视为一个错误,因为它意味着部分更新,但是这个答案让我想到了它,说不完整的表示仍然是给服务器的完整替代是有道理的用默认值填空的自由。
我在 HTTP 标准上找不到任何与此相关的内容,所以我不得不问,在这种情况下预期的标准化行为是什么?
它应该会导致错误,因为它意味着部分更新。PUT 有效负载的模式应该与使用 GET 检索到的相同资源和媒体类型的模式相同。
它应该会成功,因为服务器可以使用该媒体类型的默认值来填充空白。在这种情况下,它将密码重置为空白或默认密码并相应地刷新哈希,并将 last_visit 和 public 值设置为默认值。当您考虑 HATEOAS 时,此选项更有意义,如果客户端提交的媒体类型与服务器返回的相同,因为它无法预测超媒体控件将如何变化,每次客户端的表示必然是不完整的'不发送所有超链接,服务器必须相应地重置它们。
1 和 2 都是有效的,因为没有标准化的行为,由媒体类型决定如何处理它。这感觉不对,因为 PUT 不从属于资源本身,而是替换它。
请记住,我不是在问什么感觉对或什么有意义。我在问哪一个是由标准支持的。