42、响应处理-【源码分析】-浏览器与PostMan内容协商完全适配
42、响应处理源码分析浏览器与PostMan内容协商完全适配
要实现浏览器与PostMan在内容协商上的完全适配,需要在Spring Boot应用中自定义内容协商策略,确保服务器能根据浏览器和PostMan的请求头正确返回合适格式的数据。以下是详细的步骤:
### 1. 理解内容协商
**内容协商**是HTTP协议中的一种机制,允许服务器根据客户端的请求头信息(如`Accept`、`Accept-Language`、`Accept-Encoding`等),选择最合适的响应内容格式。例如,客户端可以通过`Accept`头指定希望接收的数据格式,如`application/json`或`application/xml`。
### 2. 默认内容协商行为
Spring Boot默认使用`HeaderContentNegotiationStrategy`,根据请求头中的`Accept`字段进行内容协商。但对于浏览器请求,通常不显式设置`Accept`头,Spring Boot会默认返回HTML格式。
### 3. 自定义内容协商策略
为了实现浏览器与PostMan的完全适配,可以添加基于请求参数的内容协商策略,同时保留基于请求头的策略。
#### 步骤1:引入依赖
如果需要支持XML格式,引入Jackson的XML处理模块:
```xml
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</dependency>
```
#### 步骤2:配置内容协商
创建配置类,自定义内容协商策略:
```java
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
// 定义支持的媒体类型和参数映射
Map<String, MediaType> mediaTypes = new HashMap<>();
mediaTypes.put("json", MediaType.APPLICATION_JSON);
mediaTypes.put("xml", MediaType.APPLICATION_XML);
mediaTypes.put("gg", MediaType.parseMediaType("application/x-guigu")); // 自定义格式
// 创建基于请求参数的内容协商策略
ParameterContentNegotiationStrategy parameterStrategy =
new ParameterContentNegotiationStrategy(mediaTypes);
parameterStrategy.setParameterName("format"); // 指定参数名为format
// 保留基于请求头的策略
HeaderContentNegotiationStrategy headerStrategy = new HeaderContentNegotiationStrategy();
// 配置内容协商策略
configurer.strategies(Arrays.asList(parameterStrategy, headerStrategy));
}
}
```
#### 步骤3:启用请求参数内容协商(可选)
在`application.properties`中开启基于请求参数的内容协商:
```properties
spring.contentnegotiation.favor-parameter=true
```
### 4. 测试与验证
#### PostMan测试
- 发送GET请求到`http://localhost:8080/test/person`,设置请求头`Accept: application/json`,返回JSON格式数据。
- 发送GET请求到`http://localhost:8080/test/person?format=xml`,返回XML格式数据。
- 发送GET请求到`http://localhost:8080/test/person?format=gg`,返回自定义格式数据。
#### 浏览器测试
- 在浏览器中访问`http://localhost:8080/test/person`,返回HTML格式数据(如果未配置视图解析器,可能报错)。
- 在浏览器中访问`http://localhost:8080/test/person?format=json`,返回JSON格式数据。
- 在浏览器中访问`http://localhost:8080/test/person?format=xml`,返回XML格式数据。
### 5. 注意事项
- **默认行为覆盖**:自定义内容协商策略可能会覆盖默认行为,需确保所有功能正常。
- **媒体类型注册**:确保所有自定义媒体类型在`mediaTypes`中注册。
- **Converter支持**:确保有对应的`MessageConverter`支持转换自定义格式。
通过以上步骤,可以实现浏览器与PostMan在内容协商上的完全适配,根据请求头或请求参数返回合适格式的数据。