在移动应用客户端的RESTful API后端中,我们有一个资源User
,数据库字段为birthday
。
当Sam对自己的个人资料GET /user/1
进行身份验证时,我们会收到这样的资源:
{
id: 1,
name: "Sam Smith",
birthday: "1990-01-01",
age: 27
}
在这种情况下,age
仅仅是客户的便利,不必计算Sam的年龄。
但是当一个陌生人要求Sam的个人资料GET /user/1
时,他收到的资源略有不同:
{
id: 1,
name: "Sam Smith",
age: 27
}
此处,隐私birthday
被省略,现在age
不仅仅是方便,还需要它,因为客户端无法在没有birthday
的情况下计算年龄。
我已经在指示客户端根据权限可能会省略某些字段。
但是当Sam希望更新他的个人资料时,他会获取之前收到的资源,并对其进行修改,并PUT /user/1
。
{
id: 1,
name: "Sam Smith",
birthday: "2000-02-02", // Birthday was changed
age: 27 // Should he update the age? It's the same data source as birthday.
}
服务器端我可以选择忽略age
,但客户可能认为他们可以直接更改age
字段。我可以禁止age
资源上的PUT
字段,但客户端必须修改从GET
请求中收到的资源架构。
在这种情况下,最佳原则是什么?
客户端是否真的在PUT
请求中计算新的年龄,即使服务器会忽略它,否则会返回HTTP 409
冲突响应?