通过REST更新资源(PUT/POST)

通过REST更新资源(PUT/POST),rest,http,post,spring-boot,put,Rest,Http,Post,Spring Boot,Put,当通过REST更新资源时,应该只在主体中包括要更新的值,还是包括整个对象的当前值和要更新的值 如果用户对象如下所示 User (id, name, age, sex) 如果我的请求是这样的,我只想更新他的姓名和年龄: PUT /users/1 {"name":"john","age":18} PUT /users/1 {"name":"john","age":18, "sex":"m"} 或者像这样: PUT /users/1 {"name":"john","age":18}

当通过REST更新资源时,应该只在主体中包括要更新的值,还是包括整个对象的当前值和要更新的值

如果用户对象如下所示

User (id, name, age, sex)  
如果我的请求是这样的,我只想更新他的姓名和年龄:

PUT /users/1

{"name":"john","age":18}
PUT /users/1

{"name":"john","age":18, "sex":"m"}
或者像这样:

PUT /users/1

{"name":"john","age":18}
PUT /users/1

{"name":"john","age":18, "sex":"m"}
服务器端应该是什么样子

@RequestMapping(value = "/{userId}", method = PUT, consumes = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<String> updateUser(@PathVariable final int userId, @RequestBody User u){
    //fetch user by ID 
    user.setName(u.getName())
    user.setAge(u.getAge())
    user.setSex(u.getSex()) //this will be empty?

    return new ResponseEntity<String>(gson.toJson(user), HttpStatus.OK);
}
有没有正确/错误的方法来实现这一点,或者只是做最简单的事情?

PUT请求必须是幂等的,并且应该作为其负载提供所替换实体的完整表示

PUT方法请求目标资源的状态为 创建或替换为表示所定义的状态 包含在请求消息有效负载中

部分JSON对象PUT请求将是内容类型为application/merge PATCH+JSON的补丁

要考虑的事情。您可能有多个客户端同时更新一个实体,使用PUT可能会覆盖其他客户端所做的更改

在这种情况下,您可能需要设置一个前置条件,以检查在请求客户端获取实体、进行更改和提交PUT/PATCH请求之间对象是否已更新。例如,前提条件可以是最后更新的时间戳、哈希Etag或版本号;或者,您可以使用最后写入wins方法,这在最终一致的系统中很常见。这完全取决于你的系统和情况

在服务器端,如果您支持部分更新,那么正如您在示例中所提供的那样,您将标识请求中包含的属性集,并仅设置所提供的特定属性。

PUT请求必须是幂等的,并且应作为其有效负载提供其所替换实体的完整表示

PUT方法请求目标资源的状态为 创建或替换为表示所定义的状态 包含在请求消息有效负载中

部分JSON对象PUT请求将是内容类型为application/merge PATCH+JSON的补丁

要考虑的事情。您可能有多个客户端同时更新一个实体,使用PUT可能会覆盖其他客户端所做的更改

在这种情况下,您可能需要设置一个前置条件,以检查在请求客户端获取实体、进行更改和提交PUT/PATCH请求之间对象是否已更新。例如,前提条件可以是最后更新的时间戳、哈希Etag或版本号;或者,您可以使用最后写入wins方法,这在最终一致的系统中很常见。这完全取决于你的系统和情况

在服务器端,如果您支持部分更新,那么正如您在示例中所提供的那样,您将标识请求中包含的属性集,并且只设置所提供的特定属性