当前位置: 首页 > article >正文

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在内容协商上的完全适配,根据请求头或请求参数返回合适格式的数据。

相关文章:

42、响应处理-【源码分析】-浏览器与PostMan内容协商完全适配

42、响应处理源码分析浏览器与PostMan内容协商完全适配 要实现浏览器与PostMan在内容协商上的完全适配&#xff0c;需要在Spring Boot应用中自定义内容协商策略&#xff0c;确保服务器能根据浏览器和PostMan的请求头正确返回合适格式的数据。以下是详细的步骤&#xff1a; ### …...

在 CentOS 上安装 Docker 和 Docker Compose 并配置使用国内镜像源

在 CentOS 上安装 Docker 和 Docker Compose 并配置使用国内镜像源&#xff0c;可以加速镜像下载速度。以下是详细的步骤&#xff1a; 一、安装 Docker 移除旧版本的 Docker&#xff08;如果有&#xff09;&#xff1a; sudo yum remove docker \docker-client \docker-client…...

Java Lambda表达式深度解析:从入门到实战

简介 Lambda表达式是Java 8引入的最重要特性之一,它极大地简化了Java代码的编写方式,使函数式编程风格在Java中成为可能。本文将全面介绍Lambda表达式的概念、语法、应用场景以及与相关特性的配合使用,帮助开发者掌握这一强大的编程工具。 一、Lambda表达式基础 1.1 什么…...

Docker慢慢学

1、Docker DeskTop 2、N8N下载 docker run -p 8888:5678 n8nio/n8n 3、Kafka kafka依赖zookeeper,先启动zookeeper docker pull zookeeper docker run -d --name zookeeper -p 2181:2181 -e ALLOW_ANONYMOUS_LOGINyes zookeeper 启动kafka docker pull confluentinc/cp…...

cursor-free-vip使用

一、项目简介 Cursor-Free-VIP 是一个开源项目&#xff0c;旨在帮助用户免费使用 Cursor AI 的高级功能。它通过自动注册 Cursor 账号、重置机器 ID 和完成 Auth 验证等操作&#xff0c;解决 Cursor AI 中常见的限制提示。 二、系统准备 1…cursor需要更新到最新的版本 三、…...

使用SSH tunnel访问内网的MySQL

文章目录 环境背景方法参考 注&#xff1a;本文是使用SSH tunnel做端口转发的一个示例。有关SSH端口转发&#xff0c;可参考我的几篇文档 https://blog.csdn.net/duke_ding2/article/details/106878081https://blog.csdn.net/duke_ding2/article/details/135627263https://blo…...

Redis持久化模式RDB与AOF

RDB持久化 RDB也被叫做Redis数据快照。简单来说就是把内存中的所有数据记录到磁盘中。当Redis实例故障重启后重磁盘中读取快照文件进行数据恢复(快照文件默认保存在当前运行目录)&#xff1b; 演示Redis正常停机自动执行一次RDB操作 配置Redis触发RDB机制 RDB其它配置也可在red…...

【JS进阶】ES5 实现继承的几种方式

ES5 实现继承的几种方式 1. 原型链继承&#xff08;Prototype Chaining&#xff09; function Parent(name) {this.name name || Parent;this.colors [red, blue]; }Parent.prototype.sayName function() {console.log(this.name); };function Child() {}// 关键&#xff…...

【数据结构】树形结构--二叉树(二)

【数据结构】树形结构--二叉树&#xff08;二&#xff09; 一.二叉树的实现1.求二叉树结点的个数2.求二叉树叶子结点的个数3.求二叉树第k层结点的个数4.求二叉树的深度&#xff08;高度&#xff09;5.在二叉树中查找值为x的结点6.判断二叉树是否为完全二叉树7.二叉树的销毁 一.…...

JavaScript性能优化实战:深入探讨JavaScript性能瓶颈与优化技巧

引言:为什么JavaScript性能至关重要 在现代Web开发中,JavaScript已成为构建交互式应用程序的核心技术。随着单页应用(SPA)和复杂前端架构的普及,JavaScript代码的性能直接影响用户体验、转化率甚至搜索引擎排名。研究表明,页面加载时间每增加1秒,转化率可能下降7%,而性能…...

在 CentOS 上将 Ansible 项目推送到 GitHub 的完整指南

1. 安装 Git 在 CentOS 中使用 yum 安装 Git&#xff0c;Git 是管理代码版本控制的工具&#xff1a; sudo yum install git -y 2. 配置 Git 用户信息 设置你的 Git 用户名和邮箱&#xff0c;这些信息会出现在你每次提交的记录中&#xff1a; git config --global user.nam…...

深度学习题目1

梯度下降法的正确步骤是什么&#xff1f; a.计算预测值和真实值之间的误差 b.重复迭代&#xff0c;直至得到网络权重的最佳值 c.把输入传入网络&#xff0c;得到输出值 d.用随机值初始化权重和偏差 e.对每一个产生误差的神经元&#xff0c;调整相应的&#xff08;权重&#xff…...

Spring @Scheduled vs XXL-JOB vs DolphinScheduler vs Airflow:任务调度框架全景对比

引言 从单机定时任务到分布式工作流调度&#xff0c;不同场景需要选择匹配的调度框架。 本文对比 Spring Scheduled、XXL-JOB、DolphinScheduler &#xff08;海豚调度器&#xff09;和 Apache Airflow 的核心差异&#xff0c;助你避免过度设计或功能不足。 一、核心定位与适用…...

【Oracle】锁

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 锁基础概述1.1 锁的概念与作用1.2 锁的工作原理1.3 Oracle锁的分类 2. 行级锁 (Row-Level Locks)2.1 行级锁的基本概念2.1.1 TX锁&#xff08;事务锁&#xff09;2.1.2 行级锁的工作机制 2.2 行级锁的类型2.…...

共识算法Raft系列(1)——什么是Raft?

Raft 算法是一种分布式一致性算法&#xff0c;由 Diego Ongaro 和 John Ousterhout 在 2014 年提出&#xff0c;旨在解决 Paxos 算法复杂且难以理解的问题。Raft 设计目标是易于理解和实现&#xff0c;同时提供强一致性&#xff08;CAP 中的 CP 系统&#xff09;&#xff0c;广…...

JS逆向爬虫教程与实战技巧

想要一个关于爬虫JS逆向的详细教程。这是一个很专业的技术需求&#xff0c;最近有个可能是正在学习爬虫技术的开发者或者数据分析师&#xff0c;遇到了需要破解JavaScript加密的反爬机制的问题&#xff0c;想让我出一期实战教程&#xff0c;话不多说&#xff0c;开干。 以下是我…...

Neovim - LSP 底层原理,难点配置(二)

Neovim LSP 的工作原理 基本概念 LSP(Language Server Protocol)可以理解成是一个"语言助手"。每种编程语言都有自己的"语言助手"(比如 TypeScript 的 tsserver),这些助手能告诉你: 哪写错了(语法错误)哪能跳转(方法定义,引用)哪可以补全(自…...

【Redis】Redis 的常见客户端汇总

目录 一、命令行客户端 二、图形界面的客户端 三、Java 客户端 3.1 SpringDataRedis 3.2 Jedis 3.2.1 连接池的配置 3.3 Lettuce 3.3.1 RedisTemplate 工具类实现 3.3.2 自定义序列化器 3.3.3 StringRedisTemplate 3.3.4 集群配置 3.3.4.1 刷新节点集群拓扑动态感应…...

关于akka官方quickstart示例程序(scala)的记录

参考资料 https://doc.akka.io/libraries/akka-core/current/typed/actors.html#first-example 关于scala语法的注意事项 extends App是个语法糖&#xff0c;等同于直接在伴生对象中编写main 方法对象是通过apply方法创建的&#xff0c;也可以通过对象的名称单独创建&#x…...

2025年渗透测试面试题总结-腾讯[实习]玄武实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]玄武实验室-安全工程师 1. 自我介绍 2. CSRF原理 3. Web安全入门时间 4. 学习Web安全的原因 …...

网站首页菜单两种布局vue+elementui顶部和左侧栏导航

顶部菜单实现 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Vue.js Element UI 路由导航</…...

AWS之迁移与传输服务

目录 一、迁移管理与规划类 二、应用程序迁移类 1. MGN的迁移范围(能替代的场景) ✅ 自动包含以下数据: 🔹 适用场景举例: 2. 仍需DMS或DataSync的场景(不可替代) ❌ DMS仍必要的情况: ❌ DataSync仍必要的情况: 3. 技术原理对比 MGN的数据迁移机制: DMS…...

@Builder的用法

Builder 是 Lombok 提供的一个注解&#xff0c;用于简化 Java 中构建对象的方式&#xff08;Builder 模式&#xff09;。它可以让你以更加简洁、链式的方式来创建对象&#xff0c;尤其适用于构造参数较多或部分可选的类。...

Unity3D 逻辑代码性能优化策略

前言 在Unity3D中优化逻辑代码性能是提升游戏流畅度的关键。以下是系统性的优化策略和示例&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&#xff0c;希望大家可以点击进来一起交流一下开发经验呀&#xff01; 1. 避免高频操作中的开销 缓存组件引用 private …...

【Python Cookbook】文件与 IO(二)

文件与 IO&#xff08;二&#xff09; 6.字符串的 I/O 操作7.读写压缩文件8.固定大小记录的文件迭代&#xff08;⭐⭐&#xff09; 6.字符串的 I/O 操作 你想使用操作类文件对象的程序来操作文本或二进制字符串。 使用 io.StringIO() 和 io.BytesIO() 类来创建类文件对象操作…...

vue实现点击按钮input保持聚焦状态

主要功能&#xff1a; 点击"停顿"按钮切换对话框显示状态输入框聚焦时保持状态点击对话框外的区域自动关闭 以下是代码版本&#xff1a; <template><div class"input-container"><el-inputv-model"input"style"width: 2…...

[蓝桥杯]取球博弈

取球博弈 题目描述 两个人玩取球的游戏。 一共有 NN 个球&#xff0c;每人轮流取球&#xff0c;每次可取集合 n1,n2,n3n1​,n2​,n3​中的任何一个数目。 如果无法继续取球&#xff0c;则游戏结束。 此时&#xff0c;持有奇数个球的一方获胜。 如果两人都是奇数&#xff…...

Spring Security入门:创建第一个安全REST端点项目

项目初始化与基础配置 创建基础Spring Boot项目 我们首先创建一个名为ssia-ch2-ex1的空项目(该名称与配套源码中的示例项目保持一致)。项目需要添加以下两个核心依赖: org.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-starter-secur…...

[Java 基础]数组

什么是数组&#xff1f;想象一下&#xff0c;你需要存储 5 个学生的考试成绩。你可以声明 5 个不同的 int 变量&#xff0c;但这会显得很笨拙。数组提供了一种更简洁、更有组织的方式来存储和管理这些数据。 数组可以看作是相同类型元素的集合&#xff0c;这些元素在内存中是连…...

fastadmin fildList 动态下拉框默认选中

html页面 <td><select class"form-control dtselect" data-rule"required" data-dtselected"<%row.type%>" name"<%name%>[<%index%>][type]">{foreach nametypeList idvo}<option value"{$vo…...