目录
1 HttpMessageConverter 介绍
2 @RequestBody 注解
3 @ResponseBody 注解
4 RequestEntity
5 ResponseEntity
6 @RestController 注解
1 HttpMessageConverter 介绍
HttpMessageConverter 报文信息转换器,将请求报文(如JSON、XML、HTML等)转换为 Java 对象,或将 Java 对象转换为响应报文。SpringMVC 提供了多个内置的 HttpMessageConverter 实现,以支持不同的数据格式和数据类型。
以下是一些常见的 HttpMessageConverter 实现:
-
MappingJackson2HttpMessageConverter:用于将 Java 对象转换为 JSON 格式的 HTTP 响应,或将 JSON 格式的 HTTP 请求转换为 Java 对象
-
StringHttpMessageConverter:用于将 String 对象转换为 HTTP 响应的报文信息,或将 HTTP 请求中的报文信息转换为 String 对象
-
MappingJackson2XmlHttpMessageConverter:用于将 Java 对象转换为 XML 格式的 HTTP 响应,或将 XML 格式的 HTTP 请求转换为 Java 对象
-
ByteArrayHttpMessageConverter:用于将字节数组转换为 HTTP 响应的报文信息,或将 HTTP 请求中的报文信息转换为字节数组
HttpMessageConverter 提供了两个注解 (@RequestBody 和 @ResponseBody) 和两个类型 (RequestEntity 和 ResponseEntity)。 其中,@RequestBody 和 @ResponseBody 是用于处理 HTTP 请求和响应的注解,而 RequestEntity 和 ResponseEntity 是用于封装 HTTP 请求和响应的类型。
SpringMVC 能够自动根据请求的 Content-Type 和 Accept 来选择合适的转换器进行报文信息的转换。
- @RequestBody 注解: 根据请求头的 Content-Type 属性,逐一匹配合适的HttpMessageConverter 转换器来读取数据
- @ResponseBody 注解: 根据请求头的 Accept 属性(逗号分隔),来遍历可用的 HttpMessageConverter 转换器,以找到能够处理对应类型的转换器
注:使用转换器时,需要注意转换器的优先级,如上图所示,数字越小,优先级越高。
2 @RequestBody 注解
@RequestBody 注解可以获取请求体,需要在控制器方法设置一个形参,使用 @RequestBody 注解进行标识,当前请求的请求体就会为当前注解所标识的形参赋值
@PostMapping("/create")
public void createNewObject(@RequestBody MyObject myObject) {// 处理接收到的对象
}
3 @ResponseBody 注解
@ResponseBody 注解用于标识一个控制器方法,可以将该方法的返回值直接作为响应报文的响应体并响应到浏览器
@GetMapping("/get")
@ResponseBody
public MyObject getObject() {MyObject myObject = // 获取对象的逻辑return myObject;
}
4 RequestEntity
RequestEntity 是封装请求报文的一种类型,需要在控制器方法的形参中设置该类型的形参,当前请求的请求报文就会赋值给该形参,可以通过 getHeaders() 获取请求头信息,通过 getBody() 获取请求体信息。
@RequestMapping("/testRequestEntity")
public String testRequestEntity(RequestEntity<String> requestEntity){System.out.println("requestHeader:"+requestEntity.getHeaders());System.out.println("requestBody:"+requestEntity.getBody());return "success";
}
5 ResponseEntity
ResponseEntity 用于封装 HTTP 响应的详细信息。它提供了一种灵活的方式来表示和处理 HTTP 响应,包括状态码、响应头和响应体。
@GetMapping("/hello")
ResponseEntity<String> hello() {HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_JSON);headers.set("Custom-Header", "Value");return new ResponseEntity<>("Hello World!", headers, HttpStatus.OK);
}
上述代码中,"Hello World!" 是响应体的 Java 对象,可以是任意类型 (如 String、Object、List 等),headers 是响应头,HttpStatus.OK 是状态码,使用 HttpStatus 枚举来指定。
6 @RestController 注解
@RestController 注解是 SpringMVC 中用于标记控制器类的一个注解。它使得控制器类可以直接返回数据(字符串、对象、集合等)给客户端,而不需要额外的视图解析。
@RestController
public class MyController {@GetMapping("/hello")public String hello() {return "Hello, World!";}
}