繁体   English   中英

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

[英]REST method to Create new resource using POST

  1. 我想在/ users {“名称”:“先生。 伍兹”,“年龄”:29}
  2. 我的请求中没有ID。

  3. 服务器将使用自动生成的ID创建新资源(即使同一数据存在,但ID也不同),例如1234

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

  5. 现在,我是否应该仅将新ID作为响应中的返回值或输入请求中设置的新ID返回并返回整个实体? {“ id”:1234,“ name”:“ Mr。 伍兹”,“年龄”:29}

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

我将使用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);
  }

}

现在,我是否应该仅将新ID作为响应中的返回值或输入请求中设置的新ID返回并返回整个实体? {“ id”:1234,“ name”:“ Mr。 伍兹”,“年龄”:29}

成功的Rest POST请求不一定需要具有响应正文,总的来说,如果这些完全是请求中提供的相同数据+创建的ID。
location header中包含所创建资源的URI的201 Created响应看起来不错。

这并不意味着禁止在POST响应中设置正文,仅当它为客户端添加了一些附加值时才应设置它。
例如,假设资源创建可能会更改客户端提供的数据(清理,计算等),那么在主体响应中设置资源可能是有意义的。

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

这取决于您希望Rest服务的行为方式:

  • 无论是你决定的更新是法律与POST :在该ID是否这种情况下null ,创建资源,如果它不是null ,您更新资源,如果一切都很好,你可以返回202 Accepted
  • 或者,您决定使用POST更新是不合法的:在另一种情况下,如果ID不为null ,则会返回错误响应,例如400 Bad Request

我的请求中没有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 / users但已经在输入中提供了ID时,我们是否需要在创建一个新请求之前验证它是否为null?

理想情况下,如果遵循HTTP规范,则应对其进行验证。 发布应始终导致资源的创建。 但是,这只是遵循规范,如果您希望使POST幂等,则不会阻止您

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM