ResponseEntity和ResponseBody以及ResponseStatus区别

栏目: Java · 发布时间: 7年前

内容简介:ResponseEntity 表示整个HTTP响应:状态代码,标题和正文。因此,我们可以使用它来完全配置HTTP响应,它是一个对象,而而ResponseStatus一般与RestController组合使用:

ResponseEntity和@ResponseBody以及@ResponseStatus区别

ResponseEntity 表示整个HTTP响应:状态代码,标题和正文。因此,我们可以使用它来完全配置HTTP响应,它是一个对象,而 @ResponseBody 和@ResponseStatus是注解,适合于简单直接的场合。

@ResponseBody 一般与@Controller组合使用,用来返回JSON字符串:

  • @Controller
  • @ResponseBody

而ResponseStatus一般与RestController组合使用:

  • @RestController
  • @ResponseStatus

@ResponseStatus无法设置标题,也无法设置HttpServletResponse或HttpHeaders参数,但是很简单方便。

ResponseEntity让你做更多的定制工作。

ResponseEntity

ResponseEntity 是一种泛型类型。因此,我们可以使用任何类型作为响应主体:

@Controller
public class XXXController{

 @GetMapping("/hello")
 public ResponseEntity<String> hello() {
   return new ResponseEntity<>("Hello World!", HttpStatus.OK);
 }

这里字符串"Hello World!"作为字符串返回给REST端。

我们可以设置HTTP标头:

@GetMapping("/customHeader")
ResponseEntity<String> customHeader() {
   HttpHeaders headers = new HttpHeaders();
   headers.add("Custom-Header", "foo");

   return new ResponseEntity<>(
         "Custom header set", headers, HttpStatus.OK);
}

设置自定义标头:

@GetMapping("/customHeader")
ResponseEntity<String> customHeader() {
   return ResponseEntity.ok()
         .header("Custom-Header", "foo")
         .body("Custom header set")

如果将一个对象放入:

@GetMapping("/hello")
 public ResponseEntity<String> hello() {
   return new ResponseEntity<>(new User(‘jdon’), HttpStatus.OK);
 }

返回是JSON字符串:

[ { ‘name’: 'jdon'}]

下面是返回对象的JSON列表:

public ResponseEntity<List<ProcessDef>> repositoryProcessDefinitionsGet() {
   return new ResponseEntity<>(processDefRepo.findAll(), HttpStatus.FOUND);
}

以上是通过ResponseEntity这个对象在代码中灵活操控响应,但是在一般情况下我们只是想返回一个带有数据的正常响应,那么只要使用@注解即可

@ResponseBody

在类级别使用@Controller标注情况下 , @ResponseBody 注解告诉返回的对象将自动序列化为JSON,并通过回控制器 的HttpResponse 对象。

@Controller
public class XXXController{

  @ResponseBody
  public User postResponseController(@RequestBody LoginForm loginForm) {
      return new User("Thanks For Posting!!!");
  }

将返回客户端JSON字符串:

[ { ‘name’: Thanks For Posting!!!"}]

在@RestController注解了类的情况下,我们就不需要再使用 @ResponseBody 了,可以直接返回对象,并使用ResponseStatus返回状态码!

@ResponseStatus

ResponseStatus虽然只是规定了返回的状态,但是只需要标注在方法上,简单,而且状态码与返回类型分离,比较清晰。我们将上面返回对象列表的代码使用ResponseStatus改写如下,注意类级别@RestController:

@RestController
public class XXXController{

 @ResponseStatus(HttpStatus.FOUND)
 public User postResponseController() {
    return new User("Thanks For Posting!!!");
 }

这也会返回客户端JSON字符串:

[ { ‘name’: Thanks For Posting!!!"}]

这样的代码更加专注于业务。

直接操控响应

Spring还允许我们直接访问 javax.servlet.http.HttpServletResponse 对象; 我们只需要将它声明为方法参数:

@GetMapping("/manual")
public void manual(HttpServletResponse response) throws IOException {
      response.setHeader("Custom-Header", "foo");
      response.setStatus(200);
      response.getWriter().println("Hello World!");
      }

由于Spring在底层实现之上提供了抽象和附加功能,因此 如果以这种方式直接操纵响应,会失去很多Spring提供方便功能

结论

@RestController + @ResponseStatus = @Controller + @ResponseBody

Spring Boot


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

电子邮件营销密码

电子邮件营销密码

[美] Jeanniey Mullen、David Daniesl / 薛剑韬 / 人民邮电出版社 / 2009-9 / 39.00元

在当今互联网蓬勃发展的形势下,电子邮件是互联网应用最广的服务之一。那么如何利用其作为有效的营销工具呢?本书系统地讲解了美国电子邮件营销的预算统筹、营销策略、管理模式、执行机制、涉及的技术、营销实施的细节等,其方法有很强的可循性,并可预见将获得的成果。阅读本书之后,读者会深刻感受到电子邮件营销的博大精深,它既是一门扎实严谨的科学,又是一项充满创造力的艺术。. 本书适合企业管理人员及市场营销人员......一起来看看 《电子邮件营销密码》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

URL 编码/解码
URL 编码/解码

URL 编码/解码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换