107 在携带请求体的情况下, hutool 将 get 请求转换为了 post 请求

前言

本问题主要是来自于同事 

情况大致如下, 同样的代码 一个是测试用例, 一个是生产环境的应用, 访问同一个第三方服务, 参数什么的完全一致 

但是 出现的问题就是 测试用例能够拿到正确的对方的响应, 但是 生产环境的应用 却是拿到的对方的报错 

然后 我开始以为是 是否是 签名数据存在问题, 但是 使用 curl 将两套请求[测试用例/生产环境的应用] 发送给对方服务器, 是能够拿到正确的响应的 

所以 所有的参数 什么的都是正常的, 那么可能存在的差异的地方就是 两套发包的 jar 是否一致, 验证一下 是相同的

另外 就是 http 客户端 是否存在问题, 然后 检查了一下 测试用例 的客户端 和 生产应用的客户端, 测试用例的是 hutool-all-5.8.6, 生产应用的是 hutool-all-5.4.0

然后 二话不说 在开发机上面写了一个 case 来发送请求到对方服务器 

然后 使用不同的 hutool-all 的包, 然后 果然 问题复现了

然后 之后抓包看了一下 两个版本发送的请求, 原来 是 hutool-5.4.0 将我的 get 请求改成了 post 请求, 然后 导致对方服务响应异常

这里 大概是根据 实际的问题情况 复现一下 这一整套情况

 

 

测试用例

代码使用如下相同的代码, 测试的时候 切换 hutool-all 的依赖的版本 

package com.hx.test05;import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import cn.hutool.http.Method;
import com.alibaba.fastjson.JSON;import java.util.LinkedHashMap;
import java.util.Map;/*** Test16PostHutoolRequest** @author Jerry.X.He* @version 1.0* @date 2023/2/19 15:22*/
public class Test16PostHutoolRequest {// Test16PostHutoolRequestpublic static void main(String[] args) {String url = "http://localhost:8291/userHome/serviceStats";HttpRequest request = HttpUtil.createRequest(Method.GET, url);Map<String, String> params = new LinkedHashMap<>();params.put("pageNo", "1");request.body(JSON.toJSONString(params));Map<String, String> headers = new LinkedHashMap<>();headers.put("Content-Type", "application/json;charset=UTF-8");headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36");headers.put("Accept", "application/json, text/plain, */*");request.addHeaders(headers);HttpResponse response = request.execute();System.out.println(response.body());int x = 0;}}

 

服务端代码大致如下 

主要的处理就是针对 “/serviceStats” 的 get, post 做出不同的处理, 以方便观察 

    @Operation(summary = "服务统计查询")@GetMapping("/serviceStats")@ResponseStatus(HttpStatus.OK)public ResponseData<JSONObject> serviceStats() {JSONObject result = new JSONObject();result.put("availableServiceCount", 5);result.put("unavailableServiceCount", 5);return super.ok(result);}@Operation(summary = "服务统计查询")@PostMapping("/serviceStats")@ResponseStatus(HttpStatus.OK)public ResponseData<UserHomeServiceStatusView> serviceStats2() {throw new RuntimeException("服务器异常");}

 

 

在高版本的 hutool-all 5.7.4 请求的结果如下 

250483259fdb44919c635485d34df031.png

 

在 hutool-all 5.4.0 请求的结果如下, 可以看到的是 发送的 GET 请求, 走的是 POST 的处理 

9b98d7bf45a945f6a8e236c0cd234483.png

 

 

问题抓包分析

在 hutool-all-5.7.4 版本中抓包 发送的请求如下, 发现 代码中发送的 GET 请求, 实际上发的包是 GET请求 

fe65beee74fb4c9aa67cfb9fdd48ab9b.png

 

在 hutool-all-5.4.0 版本中抓包 发送的请求如下, 发现 代码中发送的 GET 请求, 实际上发的包是 POST 请求 

5370b0cbb70f4e70aea25b39742b0222.png

 

 

问题代码分析 

将 get 换成 post 的地方居然是在 jdk 的 HttpUrlConnection 里面 

只要是使用了 HttpUrlConnection.getOutputStream 的 get 请求, 都会被换成 post 请求 

7703adef59634f929f2749b76eb105bc.png

 

HttpConnection.getOutputStream 的处理方式如下, 直接 获取 HttpURLConnection 的 outputStream

b6eae91ab3054317a235ddd9ddb0df19.png

 

然后我们来看一下 hutool-5.7.4 中的处理方式 

这里对 这里场景做了 特殊的处理

80ae0903446b411aa6b2ee77ca7d9a18.png

 

 

这个问题的修复在 5.4.2 版本中修复的 

Change Log 参见 CHANGELOG_5.0-5.7

74afcb65709c4dd59ad898d404e4b388.png

 

具体的调整来自于这里 commitLog 

17fc24ed37604ba1bd47c586d74b03d7.png

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/757653.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【CKA模拟题】学会JSONPath,精准定位Pod信息!

题干 For this question, please set this context (In exam, diff cluster name) kubectl config use-context kubernetes-adminkubernetesyou have a script named pod-filter.sh . Update this script to include a command that filters and displays the label with the…

安卓Android入门

安卓作为日常生活中不可缺少的移动操作系统&#xff0c;在5G的发展和应用过程中发挥着其重要的作用。 5G是第五代移动通信技术&#xff0c;拥有更快的速度、更高的带宽、更低的延迟和更大的连接密度。这一技术的快速发展为移动设备和应用提供了更多的可能性。 安卓和5G的关系…

Qt 多元素控件

Qt开发 多元素控件 Qt 中提供的多元素控件有: QListWidgetQListViewQTableWidgetQTableViewQTreeWidgetQTreeView xxWidget 和 xxView 之间的区别 以 QTableWidget 和 QTableView 为例. QTableView 是基于 MVC 设计的控件. QTableView 自身不持有数据. 使用QTableView 的 …

OSPF特殊区域(stub\nssa)

stub区域——只有1类、2类、3类&#xff1b;完全stub区域——只有1类、2类 NSSA区域&#xff1a;本区域将自己引入的外部路由发布给其他区域&#xff0c;但不需要接收其他区域的路由 在NSSA区域的路由器上&#xff0c;引入外部路由时&#xff0c;不会转换成5类LSA&#xff0c…

HarmonyOS系统开发ArkTS常用组件切换按钮及参数

Toggle为切换按钮组件&#xff0c;一般用于两种状态之间的切换&#xff0c;例如下图中的蓝牙开关。 Toggle组件的参数&#xff1a;Toggle(options: { type: ToggleType, isOn?: boolean }) type属性用于设置Toggle组件的类型isOn属性用于设置Toggle组件的状态selectedColor()…

51-31 CVPR’24 | VastGaussian,3D高斯大型场景重建

2024 年 2 月&#xff0c;清华大学、华为和中科院联合发布的 VastGaussian 模型&#xff0c;实现了基于 3D Gaussian Splatting 进行大型场景高保真重建和实时渲染。 Abstract 现有基于NeRF大型场景重建方法&#xff0c;往往在视觉质量和渲染速度方面存在局限性。虽然最近 3D…

docker入门(四)—— docker常用命令详解

docker 常用命令 基本命令 # 查看 docker 版本 docker version # 查看一些 docker 的详细信息 docker info 帮助命令&#xff08;–help&#xff09;&#xff0c;linux必须要会看帮助文档 docker --help[rootiZbp15293q8kgzhur7n6kvZ /]# docker --helpUsage: docker [OPTI…

【C语言】结构体类型名、变量名以及typedef

文章目录 分类判断结构体成员的使用typedef 分类判断 struct tag {char m;int i; }p;假设定义了上面这一个结构体&#xff0c;tag 就是类型名&#xff0c; p 就是变量名&#xff0c; m 和 i 就是结构体成员列表。 可以这么记&#xff0c;括号前面的是类型名&#xff0c;括号后…

【vue核心技术实战精讲】1.1 Vue开篇介绍 + 1.2 Vue的起步 和 插值表达式

文章目录 准备开始适应人群vue 框架学习路线一、vue 基础1、历史介绍2、前端框架与库的区别? 二、vue的起步 和 插值表达式Stage 1&#xff1a;下载包&#xff0c;并放入项目中Stage 2&#xff1a;编码Stage 3&#xff1a;源码 与 效果 准备开始 适应人群 有一定的HTML/CSS/…

Android仿智联详情

很久没有发文章了&#xff0c;这一年多一直在卷。最近由于疫情的原因&#xff0c;很多公司都在给员工发“毕业证”&#xff0c;我也很荣幸拿到了“毕业证”。不知道是应该开心还是桑心&#xff0c;北京最近因为疫情基本都居家办公&#xff0c;而我也开始了做简历&#xff0c;刷…

OpenCV C++ 图像处理实战 ——《物体数量计数与尺寸测量》

OpenCV C++ 图像处理实战 ——《物体数量计数与尺寸测量》 一、结果演示二、多尺度自适应Gamma矫正的低照度图像增强三、轮廓计算与尺寸测量3.1 图像二值化3.2 轮廓提取3.3 物体计数与尺寸测量四、源码测试图像下载总结一、结果演示 二、多尺度自

java数据结构与算法刷题-----LeetCode135. 分发糖果

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 1. 左右遍历2. 进阶&#xff1a;常数空间遍历&#xff0c;升序降…

HCIA复习实验题(静态路由综合实验)

一、实验拓扑 二、实验划分 三、实验需求 如上图所见&#xff1b; 四、实验结果 1.实现内网通&#xff1b; &#xff08;1&#xff09;配置R1~R5的接口IP&#xff08;以及环回接口&#xff09;&#xff1b; R1接口&#xff1a; [R1]int GigabitEthernet 0/0/0 [R1-Gigab…

低代码 + 大模型,让业务系统智能化,加速想法落地

1 AI 时代下的应用 大模型来了&#xff0c;每个行业/领域都在融合大模型。作为低代码开发的探索者&#xff0c;今天我们来聊聊业务系统是如何融合大模型实现智能化的。 我们用百度内部实际应用场景来举例。比如请假&#xff0c;智能业务助手可以帮你&#xff1a; 了解…

从零开始写 Docker(七)---实现 mydocker commit 打包容器成镜像

本文为从零开始写 Docker 系列第七篇&#xff0c;实现类似 docker commit 的功能&#xff0c;把运行状态的容器存储成镜像保存下来。 完整代码见&#xff1a;https://github.com/lixd/mydocker 欢迎 Star 推荐阅读以下文章对 docker 基本实现有一个大致认识&#xff1a; 核心原…

Jmeter-基础元件使用(二)

一、Jmeter属性 当我们想要在不同线程组中使用某变量&#xff0c;就需要使用属&#xff0c;此时Jmeter属性的设置需要函数来进行set和get操作 1.创建set函数 2.然后采用Beanshell取样器进行函数执行 3.调用全局变量pro_id 4.将上面生成的函数字符串粘贴到另一个线程组即可…

合合信息扫描全能王亮相静安区3·15活动,AI扫描带来绿色消费新体验

保护消费者的合法权益&#xff0c;是全社会的共同责任。为优化消费环境、促进品质消费高地建设&#xff0c;打造安全优质和谐的消费环境&#xff0c;上海静安区消保委于3月15日举办静安区2024年“315”国际消费者权益日活动。 “激发消费活力&#xff0c;绿色低碳同行”是本次3…

C语言字符函数和字符串函数详解

Hello, 大家好&#xff0c;我是一代&#xff0c;今天给大家带来有关字符函数和字符串函数的有关知识 所属专栏&#xff1a;C语言 创作不易&#xff0c;望得到各位佬们的互三呦 一.字符函数 在C语言中有一些函数是专门为字符设计的&#xff0c;这些函数的使用都需要包含一个头文…

管理类联考–复试–英文面试–问题–WhatWhyHow--纯英文汇总版

文章目录 Do you have any hobbies? What are you interested in? What do you usually do in your spare time? Could you tell me something about your family&#xff1f; Could you briefly introduce your family? What is your hometown like? Please tell me so…

在Arm 虚拟硬件(AVH)部署深度学习OCR算法

AI算法的嵌入式部署 AI算法在独立的设备上运行其实就是行业内的嵌入式AI的概念, 大致过程如下: 开发AI模型, 2.对数据集进行处理, 3.训练AI模型并验证效果, 4.转成ONNX格式(ONNX:万金油中间格式,给模型优化和部署带来了更多可能性)或者借助libtorch或者TensorFlow来部署C++版…