リソースの表現が不完全な PUT に期待される標準的な動作は何ですか?
たとえば、以下の HAL json で表されるUser
at があります。/api/users/1
{'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'}}
}
次に、他の属性が欠落している表現を使用して、username
andを変更する PUT リクエストを作成します。email
PUT /api/users/1
{'username': 'joeydoey',
'email': 'joey@doey.com'}
これまでは、これは部分的な更新を意味するため、エラーとして扱われるべきだと常に思っていましたが、この回答は私にそれについて考えさせました。デフォルトで空白を埋める自由。
HTTP標準でこれに関連するものを見つけることができないので、この場合に期待される標準化された動作は何ですか?
部分的な更新を意味するため、エラーが発生するはずです。PUT ペイロードのスキーマは、同じリソースおよびメディア タイプへの GET で取得されたスキーマと同一である必要があります。
サーバーはそのメディア タイプのデフォルトで空白を自由に埋めることができるため、成功するはずです。この場合、パスワードを空白またはデフォルトのパスワードにリセットし、それに応じてハッシュを更新し、last_visit と public の値をデフォルトに設定します。このオプションは、クライアントがサーバーから返されたのと同じメディア タイプを送信している場合、HATEOAS を考慮するとより意味があります。すべてのハイパーリンクを送信するわけではなく、サーバーはそれに応じてハイパーリンクをリセットする必要があります。
1 と 2 の両方が有効です。これは、標準化された動作がなく、それをどうするかを決定するのはメディアの種類次第であるためです。PUT はリソース自体に従属するのではなく、リソースを置き換えるため、これは適切ではありません。
何が正しいと感じるか、何が理にかなっているのかを尋ねているわけではないことに注意してください。どちらが標準に準拠しているかを尋ねています。