使用POST创建新资源的REST方法

时间:2018-06-23 11:19:50

标签: spring rest

  1. 我想使用/ users中的POST创建新资源 { “名称”:“先生树木”, “年龄”:29 }
  2. 请求中没有ID。

  3. 服务器将使用自动生成的ID创建新资源(即使相同的数据也具有应该执行的不同ID),例如1234

  4. 必须在响应中返回新的资源位置/ users / 1234

  5. 现在,我是否应该只将新ID作为响应中的返回值或输入请求中设置的新ID作为返回值返回整个实体? { “ id”:1234, “名称”:“先生树木”, “年龄”:29 }

  6. 此外,当请求命中POST / users但在输入中已经提供了ID时,我们是否需要在创建新请求之前验证其为null?如果输入中存在ID,在这种情况下,Http响应代码是什么?

3 个答案:

答案 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幂等,那么一切都不会阻止您