38、响应处理-【源码分析】-HTTPMessageConverter原理
38、响应处理-HTTPMessageConverter原理
# **HTTPMessageConverter原理**
`HTTPMessageConverter`是Spring框架中用于在HTTP请求和响应与Java对象之间进行双向转换的核心接口。
## **主要作用**
### **请求处理**
- **反序列化**:将HTTP请求体中的数据(如JSON、XML等)转换为Java对象,供Controller方法使用。
### **响应处理**
- **序列化**:将Controller方法返回的Java对象转换为HTTP响应体中的数据(如JSON、XML等),发送给客户端。
## **工作流程**
### **请求处理流程**
1. **获取请求信息**
- Spring MVC从请求头中获取`Content-Type`,确定请求体的数据类型。
2. **选择转换器**
- 遍历所有注册的`HttpMessageConverter`,调用`canRead`方法,找到能处理该`Content-Type`的转换器。
3. **反序列化**
- 使用选定的转换器,调用`read`方法,将请求体数据转换为Java对象,作为Controller方法的参数。
### **响应处理流程**
1. **获取响应信息**
- 从请求头中获取`Accept`,确定客户端期望的响应数据类型。
2. **选择转换器**
- 遍历所有注册的`HttpMessageConverter`,调用`canWrite`方法,找到能处理返回对象类型并满足`Accept`的转换器。
3. **序列化**
- 使用选定的转换器,调用`write`方法,将返回的Java对象转换为响应体数据,发送给客户端。
## **关键方法**
### **`canRead`**
```java
boolean canRead(Class<?> clazz, @Nullable MediaType mediaType);
```
- **功能**:判断转换器是否能读取指定类型的数据,并将其转换为`clazz`类型的Java对象。
### **`canWrite`**
```java
boolean canWrite(Class<?> clazz, @Nullable MediaType mediaType);
```
- **功能**:判断转换器是否能写入指定类型的数据,将`clazz`类型的Java对象转换为指定媒体类型的数据。
### **`read`**
```java
T read(Class<? extends T> clazz, HttpInputMessage inputMessage)
```
- **功能**:将HTTP请求体数据反序列化为Java对象。
### **`write`**
```java
void write(T t, @Nullable MediaType contentType, HttpOutputMessage outputMessage)
```
- **功能**:将Java对象序列化为HTTP响应体数据。
## **常见实现类**
### **`MappingJackson2HttpMessageConverter`**
- **功能**:基于Jackson库,处理JSON数据的转换。
### **`Jaxb2RootElementHttpMessageConverter`**
- **功能**:基于JAXB库,处理XML数据的转换。
### **`StringHttpMessageConverter`**
- **功能**:处理文本数据的转换,如`text/plain`。
### **`FormHttpMessageConverter`**
- **功能**:处理表单数据,支持`application/x-www-form-urlencoded`和`multipart/form-data`。
## **注册与配置**
### **Spring Boot自动配置**
- Spring Boot自动注册常用的`HttpMessageConverter`,满足大部分需求。
### **自定义配置**
- **实现`WebMvcConfigurer`接口**:
- 使用`extendMessageConverters`方法添加自定义转换器。
- 使用`configureMessageConverters`方法完全控制转换器配置。
## **示例**
### **请求转换**
```java
@RestController
public class UserController {
@PostMapping("/user")
public void createUser(@RequestBody User user) {
// 使用反序列化后的User对象
}
}
```
### **响应转换**
```java
@RestController
public class UserController {
@GetMapping("/user/{id}")
public User getUser(@PathVariable Long id) {
// 返回User对象,自动转换为JSON
}
}
```
---
通过`HTTPMessageConverter`,Spring MVC实现了HTTP数据与Java对象之间的无缝转换,简化了开发,提高了灵活性。开发者可以根据需要自定义转换器,满足特定的数据格式转换需求。