请求中没有ID。
服务器将使用自动生成的ID创建新资源(即使相同的数据也具有应该执行的不同ID),例如1234
必须在响应中返回新的资源位置/ users / 1234
现在,我是否应该只将新ID作为响应中的返回值或输入请求中设置的新ID作为返回值返回整个实体? { “ id”:1234, “名称”:“先生树木”, “年龄”:29 }
此外,当请求命中POST / users但在输入中已经提供了ID时,我们是否需要在创建新请求之前验证其为null?如果输入中存在ID,在这种情况下,Http响应代码是什么?
答案 0 :(得分:1)
我将使用spring hateoas(https://spring.io/projects/spring-hateoas),并创建一个像这样的对象:
public class User extends ResourceSupport {
private Long id;
private int age;
private String name;
//Setter and getter and eventually hashCode and equals
}
然后在控制器中,我将采用以下方法:
@RequestMapping(value="/users", method={RequestMethod.POST}, produces="application/json")
public ResponseEntity<User> managePerson(@RequestBody User p)
{
if(p.getId() != null)
{
//Update; in this case a 204 http status is enough and no content is required
Return ResponseEntity.status(HttpStatus.NO_CONTENT).body(null);
}
else
{
//Save and return the saved objecty with the returned ID and set the new location
p.add(new Link("/users/"+p.getId()));
Return ResponseEntity.status(HttpStatus.OK).body(p);
}
}
答案 1 :(得分:1)
现在,我应该在响应中返回新的ID作为返回值吗? 还是输入请求中设置的新ID,然后返回整个实体? { “ id”:1234,“ name”:“ Mr。伍兹”,“年龄”:29}
成功完成的Rest POST
请求不一定需要具有响应正文,总体来说,如果这些请求与所提供的ID +创建的ID完全相同。
在201 Created
中包含创建的资源的URI的location header
响应似乎很好。
这并不意味着禁止在POST响应中设置主体,仅当它为客户端添加了一些附加值时才应设置它。
例如,假设资源创建可能会更改客户端提供的数据(清理,计算等),那么在主体响应中设置资源可能是有意义的。
此外,当请求到达POST /用户但已提供ID时 在输入中,是否需要在此之前验证是否为null 创建一个新的?在这种情况下,Http响应代码是什么? 输入中是否存在ID?
这取决于您希望Rest服务的行为方式:
POST
进行更新是合法的:在这种情况下,如果ID为null
,则创建资源;如果不是null
,则更新资源,然后如果一切正常,您可以返回202 Accepted
。 POST
进行更新是不合法的:在另一种情况下,如果ID不是null
,则会返回错误响应,例如400 Bad Request
。答案 2 :(得分:0)
请求中没有ID。
您不需要一个。您只需为此使用Db-SDK。
新资源位置/ users / 1234必须在 响应
最好使其成为超媒体驱动系统HATEOS
现在,我应该在响应中返回新的ID作为返回值吗? 还是输入请求中设置的新ID,然后返回整个实体? { “ id”:1234,“ name”:“ Mr。伍兹”,“年龄”:29}
就像我说的那样,返回完整的超媒体信息是很好的,这样客户端可以在不作任何进一步修改的情况下引用它们
{
"id": 1234,
"name": "Mr.Woods",
"age": 29,
"address": "/1234/address",
"some-param": "/path-to-the-resource"
}
此外,当请求到达POST /用户但已提供ID时 在输入中,是否需要在此之前验证是否为null 创建一个新的?
理想情况下,如果遵循HTTP规范,则应进行验证。发布应始终导致资源的创建。但是,这只是遵循规范,如果您希望使POST幂等,那么一切都不会阻止您