天天看点

使用spring ResponseEntity处理http响应

使用spring ResponseEntity处理http响应

简介

使用spring时,达到同一目的通常有很多方法,对处理http响应也是一样。本文我们学习如何通过ResponseEntity设置http相应内容、状态以及头信息。

ResponseEntity

ResponseEntity标识整个http相应:状态码、头部信息以及相应体内容。因此我们可以使用其对http响应实现完整配置。

如果需要使用ResponseEntity,必须在请求点返回,通常在spring rest中实现。ResponseEntity是通用类型,因此可以使用任意类型作为响应体:

@GetMapping("/hello")

ResponseEntity<String> hello() {

    return new ResponseEntity<>("Hello World!", HttpStatus.OK);

}

1

2

3

4

可以通过编程方式指明响应状态,所以根据不同场景返回不同状态:

@GetMapping("/age")

ResponseEntity<String> age(

  @RequestParam("yearOfBirth") int yearOfBirth) {

    if (isInFuture(yearOfBirth)) {

        return new ResponseEntity<>(

          "Year of birth cannot be in the future", 

          HttpStatus.BAD_REQUEST);

    }

    return new ResponseEntity<>(

      "Your age is " + calculateAge(yearOfBirth), 

      HttpStatus.OK);

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

另外,还可以设置http响应头:

@GetMapping("/customHeader")

ResponseEntity<String> customHeader() {

    HttpHeaders headers = new HttpHeaders();

    headers.add("Custom-Header", "foo");

    return new ResponseEntity<>(

      "Custom header set", headers, HttpStatus.OK);

}

1

2

3

4

5

6

7

8

而且, ResponseEntity提供了两个内嵌的构建器接口: HeadersBuilder 和其子接口 BodyBuilder。因此我们能通过ResponseEntity的静态方法直接访问。

最简单的情况是相应包括一个主体及http 200响应码:

@GetMapping("/hello")

ResponseEntity<String> hello() {

    return ResponseEntity.ok("Hello World!");

}

1

2

3

4

大多数常用的http 响应码,可以通过下面static方法:

BodyBuilder accepted();

BodyBuilder badRequest();

BodyBuilder created(java.net.URI location);

HeadersBuilder<?> noContent();

HeadersBuilder<?> notFound();

BodyBuilder ok();

1

2

3

4

5

6

另外,可以能使用BodyBuilder status(HttpStatus status)和BodyBuilder status(int status) 方法设置http状态。使用ResponseEntity BodyBuilder.body(T body)设置http响应体:

@GetMapping("/age")

ResponseEntity<String> age(@RequestParam("yearOfBirth") int yearOfBirth) {

    if (isInFuture(yearOfBirth)) {

        return ResponseEntity.badRequest()

            .body("Year of birth cannot be in the future");

    }

    return ResponseEntity.status(HttpStatus.OK)

        .body("Your age is " + calculateAge(yearOfBirth));

}

1

2

3

4

5

6

7

8

9

10

也可以自定义头信息:

@GetMapping("/customHeader")

ResponseEntity<String> customHeader() {

    return ResponseEntity.ok()

        .header("Custom-Header", "foo")

        .body("Custom header set");

}

1

2

3

4

5

6

因为BodyBuilder.body()返回ResponseEntity 而不是 BodyBuilder,需要最后调用。注意使用HeaderBuilder 不能设置任何响应体属性。

尽管ResponseEntity非常强大,但不应该过度使用。在一些简单情况下,还有其他方法能满足我们的需求,使代码更整洁。

替代方法

@ResponseBody

典型spring mvc应用,请求点通常返回html页面。有时我们仅需要实际数据,如使用ajax请求。这时我们能通过@ResponseBody注解标记请求处理方法,审批人能够处理方法结果值作为http响应体。

@ResponseStatus

当请求点成功返回,spring提供http 200(ok)相应。如果请求点抛出异常,spring查找异常处理器,由其返回相应的http状态码。对这些方法增加@ResponseStatus注解,spring会返回自定义http状态码。

直接操作相应

Spring 也允许我们直接 javax.servlet.http.HttpServletResponse 对象;只需要申明其作为方法参数: