响应压缩导致的接口请求response没有响应体问题排查
目录
- 一、背景
- 二、排查过程
- 三、解决方法
- 四、学习与思考-响应压缩
- (一)可能原因
- (二)深入排查
- (三)注意
一、背景
接口发布到测试环境,测试同学说没有数据
二、排查过程
1、本地用相同的参数、相同的库、相同的代码分支,发现接口正常且有响应数据
2、怀疑是不是运维配置操作导致不是一个数据库
3、排查所有可能用到的测试库以及分支,发现接口还是正常的
4、实际去测试环境看接口请求响应,发现接口是200通的,但是response是空的,说明没有响应体
5、测试环境:请求接口对应的sprinboot项目服务是通过nginx转发的
最终怀疑是响应nginx拦截了
三、解决方法
- springboot项目的yml配置文件如下
server:port: 55129servlet:context-path: /testcompression:mime-types: application/jsonenabled: true
- 这里的true改为false,问题解决了
四、学习与思考-响应压缩
(一)可能原因
- 客户端不支持压缩:客户端(像浏览器或者其他调用接口的应用程序)可能不支持服务器所采用的压缩格式(通常是 gzip 或者
deflate)。当客户端接收到压缩后的响应体时,无法正确对其进行解压缩,从而造成无法解析响应数据。 - 代理服务器问题:Nginx 作为代理服务器,可能没有正确处理压缩响应。例如,在转发响应时,Nginx
可能移除了与压缩相关的请求头或者响应头,使得客户端无法识别响应是经过压缩的,进而无法正确解析。 - 压缩配置错误:Spring Boot
的压缩配置可能存在错误,比如压缩算法不兼容、压缩级别设置不合理等,导致压缩后的响应体无法被客户端正确解析。
(二)深入排查
1、检查客户端请求头:要确保客户端在请求头中包含 Accept-Encoding 字段,并且其值为 gzip, deflate,以此表明客户端支持这些压缩格式。例如,在使用 HttpClient 发送请求时,可以这样设置请求头:
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;public class HttpClientExample {public static void main(String[] args) throws IOException, InterruptedException {HttpClient client = HttpClient.newBuilder().build();HttpRequest request = HttpRequest.newBuilder().uri(URI.create("http://your_domain_or_ip/bi/your_endpoint")).header("Accept-Encoding", "gzip, deflate").build();HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());System.out.println(response.body());}
}
2、配置 Nginx 支持压缩:在 Nginx 配置文件中添加压缩相关的配置,确保 Nginx 能够正确处理压缩响应。示例配置如下:
server {listen 80;server_name your_domain_or_ip;gzip on;gzip_types application/json text/html text/css application/javascript;location /bi {proxy_pass http://localhost:55129/bi;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header Accept-Encoding ""; # 移除客户端的Accept-Encoding头proxy_pass_header Content-Encoding; # 传递响应的Content-Encoding头}
}
3、检查 Spring Boot 压缩配置:确保 Spring Boot 的压缩配置正确,例如 mime-types 设置是否包含了你希望压缩的响应类型。
server:port: 55129servlet:context-path: /testcompression:mime-types: application/json, text/html, text/css, application/javascriptenabled: true
4、与后端服务器压缩配置冲突:如果后端服务器(如 Spring Boot 应用)配置了响应压缩,而 Nginx 没有相应配置,可能会出现一些问题。例如,Nginx 可能会在转发响应时移除或修改与压缩相关的请求头和响应头,导致客户端无法正确识别和处理压缩后的数据。
移除或修改请求头
后端服务器在收到客户端请求时,会检查请求头中的Accept-Encoding字段,以确定客户端支持的压缩算法。如果客户端支持gzip或deflate等压缩算法,后端服务器会对响应数据进行压缩,并在响应头中添加Content-Encoding字段,告知客户端响应数据的压缩方式。
然而,Nginx
在转发请求时,如果没有配置处理压缩相关的请求头,可能会默认移除Accept-Encoding请求头。这样,后端服务器就无法得知客户端支持的压缩算法,可能会导致后端服务器对原本可以压缩的数据不进行压缩,或者采用客户端不支持的压缩算法进行压缩。
移除或修改响应头
后端服务器将压缩后的响应数据发送给 Nginx,Nginx
在转发响应时,如果没有配置处理压缩相关的响应头,可能会移除Content-Encoding响应头。客户端接收响应时,由于没有Content-Encoding头信息,无法得知响应数据是经过压缩的,会按照未压缩的数据格式进行解析,导致解析错误。
另外,Nginx
也可能会修改Content-Length响应头。因为压缩后的数据长度通常会小于原始数据长度,后端服务器会根据压缩后的数据长度设置Content-Length头。但
Nginx
如果不了解压缩情况,可能会错误地修改Content-Length头为原始数据长度,导致客户端在读取响应数据时,按照错误的长度进行读取,从而出现数据不完整或解析错误的情况。
- 我们项目实际上就是nginx没有配置响应压缩,而springboot项目配置了响应压缩,导致接口没有响应体。
(三)注意
当前把 enabled 设为 false 虽然解决了问题,但这样会使响应压缩功能失效,在传输大文件或者大量数据时,会增加网络带宽的占用,降低数据传输的速度。
相关文章:
响应压缩导致的接口请求response没有响应体问题排查
目录 一、背景二、排查过程三、解决方法四、学习与思考-响应压缩(一)可能原因(二)深入排查(三)注意 一、背景 接口发布到测试环境,测试同学说没有数据 二、排查过程 1、本地用相同的参数、相…...
【Linux网络】手动部署并测试内网穿透
📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...
java项目之在线购物系统(源码+文档)
项目简介 在线购物系统实现了以下功能: 使用在线购物系统的用户分管理员和用户两个角色的权限子模块。 管理员所能使用的功能主要有:主页、个人中心、用户管理、商品分类管理、商品信息管理、系统管理、订单管理等。 用户可以实现主页、个人中心、我的…...
【设计模式】C++ 单例模式总结与最佳实践
1. 单例模式简介 单例模式(Singleton Pattern) 是软件开发中常见的设计模式之一,主要用于 确保某个类只有一个实例,并提供一个全局访问点。常见的使用场景包括: 日志管理:全局唯一的日志记录器。数据库连…...
OO_Unit1
第一次作业 UML类图 代码复杂度分析 其中Expr中的toString方法认知复杂度比较高,主要源于多层条件嵌套和分散的字符串处理逻辑,重构时可重点关注这两部分的解耦。 代码量分析 1.”通用形式“ 我觉得我的设计的最大特点就是“通用形式”,具…...
重要重要!!fisher矩阵元素有什么含义和原理; Fisher 信息矩阵的形式; 得到fisher矩阵之后怎么使用
fisher矩阵元素有什么含义和原理 目录 fisher矩阵元素有什么含义和原理一、对角线元素( F i , i F_{i,i} Fi,i)的含义与原理二、非对角线元素( F i , j F_{i,j} Fi,j)的含义与原理Fisher 信息矩阵的形式矩阵的宽度有位置权重数量决定1. **模型参数结构决定矩阵维度**2.…...
[已解决]jupyter notebook报错 500 : Internal Server Error及notebook闪退
jupyter notebook出现如上图的报错,可以在黑色窗口中检查是为什么报错。 我检查发现是nbconvert导致的问题,卸载重装nbconvert。 但是这时候出现,jupyter notebook闪退问题。jupyter的黑色窗口出现一秒钟就没了。 在Anaconda Prompt中检查ju…...
2025年渗透测试面试题总结- 某亭-安全研究员(题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 一、SQL注入过滤单引号绕过方法 二、MySQL报错注入常用函数 三、报错注入绕WAF 四、MySQL写文件函数…...
Redis分布式锁如何实现——简单理解版
目录 前言 满足条件 加锁之后产生的问题 避免死锁的方法 Lua脚本实现避免释放其他锁 看门狗判断过期 扩展 Lua脚本 Redission 前言 在如今开发的某些项目中,多个进程必须以互斥的方式独占共享资源,这时用分布式锁是最直接有效的,分布式…...
数字化转型驱动卫生用品安全革新
当315晚会上晃动的暗访镜头揭露卫生巾生产车间里漂浮的异物、纸尿裤原料仓中霉变的碎屑时,这一触目惊心的场景无情地撕开了“贴身安全”的遮羞布,暴露的不仅是部分企业的道德缺失,更凸显了当前检测与监管体系的漏洞,为整个行业敲响…...
北京南文观点:品牌如何抢占AI 认知的 “黄金节点“
在算法主导的信息洪流中,品牌正在经历一场隐蔽的认知权争夺战,当用户向ChatGPT咨询"哪家新能源车企技术最可靠"时,AI调取的知识图谱数据源将直接决定品牌认知排序。南文乐园科技文化(北京)有限公司ÿ…...
分布式(一):CAPBASE理论
1 CAP理论 1.1 简介 CAP也就是Consistency(一致性)、Availability(可用性)、Partition Tolenrance(分区容错性)这三个单词首字母组合。 在理论计算机科学中,CAP定理(CAP theorem&…...
自适应柔顺性策略:扩散引导控制中学习近似的柔顺
24年10月来自斯坦福大学和 TRI 的论文“Adaptive Compliance Policy: Learning Approximate Compliance for Diffusion Guided Control”。 柔顺性在操作中起着至关重要的作用,因为它可以在不确定的情况下平衡位置和力的并发控制。然而,当今的视觉运动策…...
python中所有内置类型
文章目录 数值类型序列类型集合类型映射类型布尔类型空类型代码汇总 在 Python 中,数据类型可分为内置数据类型和用户自定义数据类型。内置数据类型是 Python 解释器直接支持的类型 数值类型 整数(int):表示整数,可正…...
「Java-API帮助文档」
「Java-API帮助文档」,链接:https://pan.quark.cn/s/d7ced3b48f33 java.applet提供创建 applet 所必需的类和 applet 用来与其 applet 上下文通信的类。java.awt包含用于创建用户界面和绘制图形图像的所有类。java.awt.color提供用于颜色空间的类。java…...
1204. 【高精度练习】密码
文章目录 题目描述输入输出样例输入样例输出数据范围限制CAC代码 题目描述 人们在做一个破译密码游戏: 有两支密码棒分别是红色和蓝色,把红色密码棒上的数字减去蓝色 密码棒上的数字,就是开启密码锁的密码。 现已知密码棒上的数字位数不超过…...
SVN简明教程——下载安装使用
SVN教程目录 一、开发中的实际问题二、简介2.1 版本控制2.2 Subversion2.3 Subversion的优良特性2.4 工作原理2.5 SVN基本操作 三、Subversion的安装与配置1. 服务器端程序版本2. 下载源码包3. 下载二进制安装包4. 安装5. 配置版本库① 为什么要配置版本库?② 创建目…...
“智改数转”新风口,物联网如何重构制造业竞争力?
一、政策背景 为深化制造业智能化改造、数字化转型、网络化联接,江苏省制定了《江苏省深化制造业智能化改造数字化转型网络化联接三年行动计划(2025-2027年)》,提出到2027年,全省制造业企业设备更新、工艺…...
从数据洪流到智能洞察:人工智能如何解锁大数据的价值?
引言:数据洪流时代,企业的机遇与挑战 在这个信息爆炸的时代,数据正以前所未有的速度增长。IDC预测,全球数据量将在未来几年内持续飙升,企业每天都会产生海量的用户行为数据、市场交易数据、设备传感数据等。理论上&…...
蓝桥杯 之 数论
文章目录 习题质数找素数 LCM报数游戏 快速幂数字诗意 组合数与错位排序小蓝与钥匙 同余取模 数论,就是一些数学问题,蓝桥杯十分喜欢考察,常见的数论的问题有:取模,同余,大整数分解,素数&#x…...
SpringBoot的启动原理?
大家好,我是锋哥。今天分享关于【SpringBoot的启动原理?】面试题。希望对大家有帮助; SpringBoot的启动原理? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Spring Boot的启动原理主要是通过 SpringApplication 类来…...
从零开始搭建向量数据库:基于 Xinference 和 Milvus 的文本搜索实践
引言 在 AI 和大数据时代,向量数据库正成为处理非结构化数据(如文本、图像)的利器。最近,我尝试用 Xinference 和 Milvus 搭建一个简单的文本搜索系统,从读取本地文本文件到实现交互式查询和高亮显示匹配结果…...
音视频系列——Websockets接口封装为Http接口
模型服务示例:实时语音转文本服务 本示例展示一个支持双协议(WebSocket流式接口HTTP同步接口)的语音转文本模型服务,并提供将WebSocket接口封装为HTTP接口的代码实现。 一、服务架构设计 #mermaid-svg-nw0dMZ4uKfS4vGZR {font-fa…...
scrapy入门(深入)
Scrapy框架简介 Scrapy是:由Python语言开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据,只需要实现少量的代码,就能够快速的抓取。 新建项目 (scrapy startproject xxx):新建一个新的…...
docker模拟Dos_SYN Flood拒绝服务攻击 (Ubuntu20.04)
目录 ✅ 一、实验环境准备(3 个终端) 👉 所以最终推荐做法: 2️⃣ 配置 seed-attacker 为攻击者,开启 telnet 服务: 3️⃣ 配置 victim-10.9.0.5 为受害者服务器,开启 telnet 客户端并监听&…...
使用 Ansys Fluent 评估金属管道腐蚀
金属管道的维护和完整性在石油和天然气、石化和供水等各个行业中都至关重要。腐蚀对这些管道构成了重大威胁,可能导致泄漏、结构故障和环境危害。Ansys Fluent 提供了一个强大的平台来建模和分析金属管道腐蚀。 腐蚀是一种自然过程,金属材料会因与环境发…...
firefly经典蓝牙和QProcess、QFileSystemWatcher记录
QProcess 默认不会启动一个 shell 来解析命令,而是直接调用操作系统的系统调用来启动外部程序。也就是通过fork一个子线程或者exec一个子进程来执行命令。 QProcess的参数模式 QProcess 需要明确指定命令的可执行文件路径或参数列表。 如果命令是一个可执行文件的路径…...
基于PySide6的CATIA自动化工具开发实战——空几何体批量清理系统
一、功能概述 本工具通过PySide6构建用户界面,结合PyCATIA库实现CATIA V5的自动化操作,提供两大核心功能: 空几何体清理:智能识别并删除零件文档中的无内容几何体(Bodies)空几何图形集清理࿱…...
Blender配置渲染设置并输出动画
在Blender中,渲染设置和渲染动画的选项位于不同的面板中。以下是具体步骤: 渲染设置 渲染设置用于配置输出格式、分辨率、帧率等参数。 打开右侧的 属性面板(按 N 键可切换显示)。 点击 “输出属性” 选项卡(图标是…...
Spring 声明式事务应该怎么学?
1、引言 Spring 的声明式事务极大地方便了日常的事务相关代码编写,它的设计如此巧妙,以至于在使用中几乎感觉不到它的存在,只需要优雅地加一个 Transactional 注解,一切就都顺理成章地完成了! 毫不夸张地讲ÿ…...
