什么是在资源的不完整表示下期望的PUT标准行为?
例如,我有一个位于/api/users/1的User,由下面的HAL json表示:
然后,我发起PUT请求来更改
到目前为止,我一直认为这应该被视为错误,因为它意味着部分更新,但this answer让我开始思考,说一个不完整的表示仍然是一个完整的替换,服务器可以用默认值填充空白。我在HTTP标准中找不到任何与此相关的内容,所以我必须问一下,在这种情况下,期望的标准化行为是什么?
例如,我有一个位于/api/users/1的User,由下面的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请求来更改
用户名
和电子邮件
,使用一个表示中没有其他属性的内容:PUT /api/users/1
{'username': 'joeydoey',
'email': 'joey@doey.com'}
到目前为止,我一直认为这应该被视为错误,因为它意味着部分更新,但this answer让我开始思考,说一个不完整的表示仍然是一个完整的替换,服务器可以用默认值填充空白。我在HTTP标准中找不到任何与此相关的内容,所以我必须问一下,在这种情况下,期望的标准化行为是什么?
应该会出现错误,因为它意味着部分更新。PUT负载的模式应与使用相同资源和媒体类型的GET检索到的模式完全相同。
应该成功,因为服务器可以用该媒体类型的默认值填写空白。在这种情况下,它将重置密码为空白或默认密码,并相应地刷新哈希,然后将last_visit和public值设置为默认值。当考虑HATEOAS时,如果客户端提交与服务器返回的相同媒体类型,则此选项更有意义,因为它无法预测超媒体控件将如何更改,表示每次客户端未发送所有超链接时必然不完整,因此服务器必须相应地重置它们。
1和2都有效,因为没有标准化行为,而是由媒体类型决定如何处理它。这感觉不对,因为PUT不是从属于资源本身,而是替换它。
请记住,我不是在问什么感觉对或有什么意义。我正在询问哪一个得到了标准支持。