@ResponseBody注解帮助我们返回的数据与自己返回的HttpEntity、ResponseEntity对象有什么区别?

文章详细介绍了SpringMVC中用于处理HTTP响应的注解@ResponseBody以及HttpEntity和ResponseEntity类。@ResponseBody用于将方法返回值直接转化为HTTP响应体,常用于返回JSON或XML数据。HttpEntity是一个包含HTTP头和主体的类,适用于自定义HTTP响应。而ResponseEntity进一步扩展了HttpEntity,增加了HTTP状态码的支持,提供更精细的响应控制。
摘要由CSDN通过智能技术生成

1、@ResponseBody注解

作用是将controller的方法返回的对象通过HttpMessageConverter或者其他转换器转换为指定的格式之后,写入到HttpServletResponse对象的body区,通常用来返回JSON数据或者是XML数据。

不使用@ResponseBody注解的效果:

在不使用 @ResponseBody的情况下会走视图处理器,如果没有对应的视图则会报404错误,不适用前后端分离或者单纯返回数据。

使用@ResponseBody注解的效果:

在使用 @ResponseBody的情况下不会再走视图处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。

/**
 * 将指定消息写回响应
 * @param httpServletResponse
 * @param message
 * @throws IOException
 */
public static void writeResponse(HttpServletResponse httpServletResponse, String message) throws IOException {
    httpServletResponse.setContentType("application/json;charset=UTF-8");
    httpServletResponse.addHeader("Access-Control-Allow-Origin", "*");
    ServletOutputStream out = httpServletResponse.getOutputStream();
    out.write(message.getBytes(StandardCharsets.UTF_8));
    out.flush();
    out.close();
}

2、HttpEntity<T>

允许直接返回自定义的Http响应,它支持自定义的一个HttpHeaders,泛型可以返回指定数据、json、二进制文件流org.springframework.core.io.Resource

以下为官方示例:

Represents an HTTP request or response entity, consisting of headers and body.
Often used in combination with the org.springframework.web.client.RestTemplate, like so:
   HttpHeaders headers = new HttpHeaders();
   headers.setContentType(MediaType.TEXT_PLAIN);
   HttpEntity<String> entity = new HttpEntity<>("Hello World", headers);
   URI location = template.postForLocation("https://example.com", entity);
   
or
   HttpEntity<String> entity = template.getForEntity("https://example.com", String.class);
   String body = entity.getBody();
   MediaType contentType = entity.getHeaders().getContentType();
   
Can also be used in Spring MVC, as a return value from a @Controller method:
   @GetMapping("/handle")
   public HttpEntity<String> handle() {
     HttpHeaders responseHeaders = new HttpHeaders();
     responseHeaders.set("MyResponseHeader", "MyValue");
     return new HttpEntity<>("Hello World", responseHeaders);
   }

public class HttpEntity<T> {

}

2、ResponseEntity<T>

ResponseEntity继承自HttpEntity,在其基础上扩展了 HttpStatus,允许直接返回自定义的Http状态码

以下为官方示例:

Extension of HttpEntity that adds an HttpStatus status code. Used in RestTemplate as well as in @Controller methods.
In RestTemplate, this class is returned by getForEntity() and exchange():
   ResponseEntity<String> entity = template.getForEntity("https://example.com", String.class);
   String body = entity.getBody();
   MediaType contentType = entity.getHeaders().getContentType();
   HttpStatus statusCode = entity.getStatusCode();
   
This can also be used in Spring MVC as the return value from an @Controller method:
   @RequestMapping("/handle")
   public ResponseEntity<String> handle() {
     URI location = ...;
     HttpHeaders responseHeaders = new HttpHeaders();
     responseHeaders.setLocation(location);
     responseHeaders.set("MyResponseHeader", "MyValue");
     return new ResponseEntity<String>("Hello World", responseHeaders, HttpStatus.CREATED);
   }
   
Or, by using a builder accessible via static methods:
   @RequestMapping("/handle")
   public ResponseEntity<String> handle() {
     URI location = ...;
     return ResponseEntity.created(location).header("MyResponseHeader", "MyValue").body("Hello World");
   }


public class ResponseEntity<T> extends HttpEntity<T> {

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

L-960

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值