将位置标题添加到Spring MVC的POST响应中?

时间:2017-03-02 03:11:57

标签: java rest http spring-mvc post

My Spring boot 1.4应用程序使用此POST方法创建资源。作为要求,它应该吐出一个位置标头,指定新创建的资源(https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html)的URL。我只是想知道是否有任何好办法,而不是手动构建URL并将其添加到响应中。

非常感谢任何帮助/线索

2 个答案:

答案 0 :(得分:3)

Building REST Services with Spring Guide中演示了这种确切的情况。

一旦您保留了新实体,就可以在控制器中使用以下内容:

URI location = ServletUriComponentsBuilder
                    .fromCurrentRequest()
                    .path("/{id}")
                    .buildAndExpand(newEntity.getId())
                    .toUri();

然后您可以使用ResponseEntity将其添加到您的回复中,如下所示:

ResponseEntity.created(location).build()

ResponseEntity.status(CREATED).header(HttpHeaders.LOCATION, location).build()

后者需要一个字符串,因此您可以在uri构建器上使用toUriString()而不是toUri()

答案 1 :(得分:0)

另一种方法是使用> Using external babel configuration > Location: "C:\Users\name\Documents\GitHub\xxx\.babelrc" Compiled successfully. 。您可以将其直接注入控制器方法中:

UriComponentsBuilder

请注意,以下内容不会计算当前请求路径。您将需要手动添加它(否则我可能会丢失一些东西)。

例如:

@PostMapping(consumes = { MediaType.APPLICATION_JSON_UTF8_VALUE })
public ResponseEntity<Void> addCustomer(
          UriComponentsBuilder uriComponentsBuilder, 
          @RequestBody CustomerRequest customerRequest ){

        final long customerId = customerService.addCustomer(customerRequest)

        UriComponents uriComponents =
                uriComponentsBuilder.path("/{id}").buildAndExpand(customerId);

        return ResponseEntity.created(uriComponents.toUri()).build();
}