@RequestBody
HttpEntity
- 当方法的入参为
HttpEntity
类型的时候,会将接收到的完整的请求信息包装成HttpEntity
交给参数。 - HttpEntity 包含有请求头和请求体的内容。
ResponseEntity
ResponseEntity
可以作为请求映射方法的返回对象,可以设置请求头、请求体、Http状态内容。
示例一
@RequestMapping("/httpEntityTest")
public ResponseEntity<String> httpEntityTest(HttpEntity<String> httpEntity) {
System.out.println(httpEntity);
HttpHeaders headers = httpEntity.getHeaders();
System.out.println(headers);
String body = httpEntity.getBody();
System.out.println(body);
HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.add("Content-Type", "application/json");
return new ResponseEntity<>(body, responseHeaders, HttpStatus.OK);
}
示例二:下载文件
@RequestMapping("/download")
public ResponseEntity<byte[]> download(HttpServletRequest request) throws Exception {
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.set("Content-Disposition", "attachment;filename=jquery-1.7.2.js");
InputStream inputStream = request.getServletContext().getResourceAsStream("script/jquery-1.7.2.js");
byte[] bytes = new byte[inputStream.available()];
if (inputStream.read(bytes) > 0) System.out.println("文件读取成功");
return new ResponseEntity<>(bytes, httpHeaders, HttpStatus.OK);
}
原理:HttpMessageConverter
HttpMessageConverter<T>
是 Spring3.0 新添加的一个接口,负责将请求信息转换为一个对象(类型为 T
),将对象(类型为 T
)输出为响应信息
- 使用
HttpMessageConverter<T>
将请求信息转化并绑定到处理方法的入参中或将响应结果转为对应类型的响应信息,Spring 提供了两种途径:
- 使用
@RequestBody
/ @ResponseBody
对处理方法进行标注 - 使用
HttpEntity<T>
/ ResponseEntity<T>
作为处理方法的入参或返回值
- 当控制器处理方法使用到
@RequestBody
/@ResponseBody
或HttpEntity<T>
/ResponseEntity<T>
时
- Spring 首先根据请求头或响应头的
Accept
属性选择匹配的 HttpMessageConverter
- 进而根据参数类型或泛型类型的过滤得到匹配的
HttpMessageConverter
- 若找不到可用的
HttpMessageConverter
将报错
@RequestBody
和 @ResponseBody
不需要成对出现HttpMessageConverter<T>
的实现类