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测试

浏览器测试

5. 注意事项

  • **默认行为覆盖**:自定义内容协商策略可能会覆盖默认行为,需确保所有功能正常。

  • **媒体类型注册**:确保所有自定义媒体类型在`mediaTypes`中注册。

  • **Converter支持**:确保有对应的`MessageConverter`支持转换自定义格式。

通过以上步骤,可以实现浏览器与PostMan在内容协商上的完全适配,根据请求头或请求参数返回合适格式的数据。

相关推荐
llwszx1 小时前
深入理解Java锁原理(一):偏向锁的设计原理与性能优化
java·spring··偏向锁
云泽野2 小时前
【Java|集合类】list遍历的6种方式
java·python·list
二进制person2 小时前
Java SE--方法的使用
java·开发语言·算法
小阳拱白菜3 小时前
java异常学习
java
程序员岳焱4 小时前
Java 与 MySQL 性能优化:Java 实现百万数据分批次插入的最佳实践
后端·mysql·性能优化
FrankYoou4 小时前
Jenkins 与 GitLab CI/CD 的核心对比
java·docker
麦兜*5 小时前
Spring Boot启动优化7板斧(延迟初始化、组件扫描精准打击、JVM参数调优):砍掉70%启动时间的魔鬼实践
java·jvm·spring boot·后端·spring·spring cloud·系统架构
KK溜了溜了5 小时前
JAVA-springboot 整合Redis
java·spring boot·redis
大只鹅5 小时前
解决 Spring Boot 对 Elasticsearch 字段没有小驼峰映射的问题
spring boot·后端·elasticsearch
ai小鬼头5 小时前
AIStarter如何快速部署Stable Diffusion?**新手也能轻松上手的AI绘图
前端·后端·github