我在设计REST API时提出了这个问题。
要更新资源,客户端必须使用更新的字段提交整个资源。问题是并非所有字段都是可编辑的。如果客户端发送的资源包含他不应更新的更新字段,该怎么办?我应该抛出某种异常还是忽略它们并更新所有可编辑的字段? 我提出了以下解决方案
class User {
private String firstName; //non-editable
private String lastName; //non-editable
private String occupation; //editable
private String address; //editable
//getters and setters
}
public void updateUser(User original, User update) {
original.setAddress(update.getAddress());
original.setOccupation(update.getOccupation());
}
我在这里看到的问题是updateUser方法与User类紧密耦合。如果我添加或删除可编辑/不可编辑的字段,我将始终必须更改方法。是否存在某种解决此类问题的最佳实践或模式。
答案 0 :(得分:2)
User上的静态方法会正确封装此功能。这样,您就可以将所有特定于用户的代码保存在一起。
class User {
private String firstName; //non-editable
private String lastName; //non-editable
private String occupation; //editable
private String address; //editable
static public void updateUser(User original, User update) {
original.setAddress(update.getAddress());
original.setOccupation(update.getOccupation());
}
}
另外,如果您非常关心firstName / lastName在创建后没有被更改,我确保不会为它们添加setter。
答案 1 :(得分:1)
作为API的用户,我想知道我何时编辑不可编辑的值,因为这可能意味着我在代码中有错误或者我误解了我的功能API。在任何一种情况下,我都希望尽可能早地找到它,所以我更喜欢通过响应中的错误代码查看异常,而不是看起来对我来说是成功的但实际上并没有做我认为的事情。
那说,这取决于具体的用例。如果没有关于如何使用API的更多细节,很难说。仅更新可编辑字段可能更有意义,只需在API文档中明确说明即可。
由于coderkevin已经调出,在User类上使用静态方法将是放置实际执行更新的代码的合适位置。