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,一经查实,立即删除!

相关文章

前端面试题详解

前端面试 1.app如何实现登陆成功&#xff0c;卸载app重新安装再进入获取上一次已经登陆的信息&#xff1f; 要实现前端APP在登录成功后&#xff0c;即使卸载并重新安装也能获取上一次已经登录的信息&#xff0c;通常涉及以下几个关键步骤&#xff1a; 1. 使用持久化存储 在APP…

【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的关系…

哪些患者不适用于数字OT训练系统进行康复训练

数字OT&#xff08;Occupational Therapy&#xff0c;职业治疗&#xff09;训练系统是一种通过数字化技术辅助患者进行康复训练的方法。尽管数字OT训练系统可以帮助很多患者进行康复训练&#xff0c;但并非所有患者都适合使用该系统。以下是一些不适合使用数字OT训练系统进行康…

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()…

Python网络爬虫的设计与实现研究

Python网络爬虫的设计与实现研究 摘要&#xff1a;随着互联网技术的快速发展&#xff0c;网络爬虫作为获取互联网信息的重要工具&#xff0c;其在数据分析、数据挖掘、自然语言处理等领域的应用越来越广泛。Python语言以其简洁、易读、强大的特点&#xff0c;成为网络爬虫开发…

【前端】Vite项目图片动态引入

我采用的vite构建的vue3项目&#xff0c;没有require命令动态引入本地图片&#xff0c; 引入图片方法如下&#xff1a; 仅供参考 方式1&#xff0c;无法动态 import emptyImage from /assets/home/yd_4.png<img :src"emptyImage" class"h-50 w-50" /&g…

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

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

Yarn 管理的前端项目转换为使用 npm

如果你想将一个使用 Yarn 管理的前端项目转换为使用 npm&#xff0c;你需要执行一些步骤来确保成功迁移。以下是一种可能的方法&#xff1a; 步骤&#xff1a; 备份项目&#xff1a; 在执行任何更改之前&#xff0c;确保你对项目进行了备份。这样可以防止意外的数据丢失。 删…

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/…

vue将中国标准时间转成年月日

vue将中国标准时间转成年月日 datesWed Mar 20 2024 00:00:00 GMT0800 (中国标准时间) const date new Date(dates);const year date.getFullYear();const month (date.getMonth() 1).toString().padStart(2, 0);const day date.getDate().toString().padStart(2, 0);thi…

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;升序降…

MQTT QoS

很多时候&#xff0c; 使用 MQTT 协议的设备都运行在网络受限的环境下&#xff0c; 而只依靠底层的 TCP 传输协议&#xff0c; 并不能 完全保证消息的可靠到达。 因此&#xff0c; MQTT 提供了 QoS 机制&#xff0c; 其核心是设计了多种消息交互机制来提供不 同的服务质量&…

游戏防沉迷系统相关内容

网站地址&#xff1a;网络游戏防沉迷实名认证系统 PHP代码&#xff1a; 创建对应文件&#xff0c;在需要的位置get传参请求即可&#xff0c;具体参数参考 网络游戏防沉迷实名认证系统接口对接技术规范v2.0 1、上传信息 <?php $url "https://wlc.nppa.gov.cn/test…