WebClient 获取不到请求体如何破解?

news/2025/2/10 8:59:24/文章来源:https://www.cnblogs.com/guoxiaoyu/p/18688171

起初在开发过程中,我遇到了一个困扰我的问题:当我将对象转换为JSON时,得到的结果与最终传给第三方接口的请求体并不一致。这个问题导致我在进行加密操作时出现了错误,因为加密的过程是基于请求体的,而请求体又受到不同因素的影响。因此,我希望能在类内部直接获取到请求体(body),以便进行加密。

然而,在查阅了一番资料后,发现 WebClient 并没有直接提供获取请求体的接口。即使我强行实现这一功能,过程也会相当繁琐。经过一番深思熟虑,我决定采用曲线救国的方法来解决这一问题。接下来,我将详细分享我是如何绕过这个困难并顺利解决问题的。

破局

首先,问题的根源在于双方请求体的JSON转换结果不一致,导致加密过程中的报错。按照逻辑,既然加密是基于请求体进行的,而请求体的格式在转换时已经出现了问题,那是不是可以直接将我自己已经转换好的JSON数据传递给第三方接口呢?

这样一来,就不再需要纠结于双方请求体转换过程中不一致的原因和细节,避免了因各种差异性带来的困扰。

MultiValueMap<String, String> jsonContentHeaders = hunYuanAuthApi.getHttpHeadersConsumer(HunYuanConstants.DEFAULT_CHAT_ACTION,chatRequest);return this.webClient.post().uri("/").headers(headers -> {headers.addAll(jsonContentHeaders);}).bodyValue(ModelOptionsUtils.toJsonString(chatRequest))
//            .body(Mono.just(chatRequest), ChatCompletionRequest.class).retrieve().bodyToFlux(String.class);

我之前在代码中使用的是 body(Mono.just(chatRequest), ChatCompletionRequest.class) 方法,其中传递的是一个对象,但这样做存在问题。后来我调整了代码,改为直接使用在加密时的转 JSON 方法,将数据转换成 JSON 格式再传递,结果完美解决了问题。

有些人可能想要去读取请求体,无非就是想打印数据,这里可以直接使用打印,并将数据传递过去即可。如果需求不仅限于打印请求体,且还希望获取一些额外的信息,例如请求头中的数据,那么在这种情况下,你可以考虑使用过滤器的方式来实现。具体的实现方法如下所示:

ExchangeFilterFunction filter = ExchangeFilterFunction.ofRequestProcessor(request -> {//打印头和cookielogger.info("Request Headers: {}", request.headers());logger.info("Request Cookies: {}", request.cookies());return Mono.just(request);
});this.webClient = WebClient.builder().baseUrl(baseUrl).filter(filter).defaultHeaders(jsonContentHeaders).build();

这个方法本身并不能直接打印请求体(body)参数,因为它的作用范围主要限于处理请求的元数据。

如果你还是执着于如何获取请求体方法,也不妨可以看看这里,解决方法确实很费劲。我也没有亲自尝试一下,地址如下:https://stackoverflow.com/questions/45240005/how-to-log-request-and-response-bodies-in-spring-webflux

起初我依赖传统的方式处理请求体,但最终却发现这些方法并不适用。经过反复思考和调整,我决定采取更加灵活的方式,直接传递已转换好的JSON数据,这一策略成功绕过了原本的问题。在解决这个问题的过程中面对复杂的技术难题,仅仅依赖常规的工具和方法并不足以高效解决问题。多尝试不同的解决方法是至关重要的。


我是努力的小雨,一个正经的 Java 东北服务端开发,整天琢磨着 AI 技术这块儿的奥秘。特爱跟人交流技术,喜欢把自己的心得和大家分享。还当上了腾讯云创作之星,阿里云专家博主,华为云云享专家,掘金优秀作者。各种征文、开源比赛的牌子也拿了。

💡 想把我在技术路上走过的弯路和经验全都分享出来,给你们的学习和成长带来点启发,帮一把。

🌟 欢迎关注努力的小雨,咱一块儿进步!🌟

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

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

相关文章

[gym 102428] Fabricating Sculptures

前言 现在补题是不是不太好 思路 转化题意给定列数 \(S\) , 方块数 \(B\) , 求一种摆放方式, 使得每一列的方块数 \(a_i\) 满足 \(a_i \geq 1\) 且 \(a_i\) 呈非严格单峰观察单峰函数的性质, 发现如果按行处理, 就是单调不增的 更一般的, 每一行放置的方块数非严格小于上一行放…

重做 CF906E Reverses

不是,JJ 怎么退役了,悲。 嗯,先有\[dp_{r}=\min_{l=1}^r[s(l,r)\text{是回文串,且长度不为 2}]dp_{l-1}+1 \] 总复杂度就 \(n^2\),考虑优化 然后有引理说,一个字符串的所有 border 构成 \(\log n\) 个等差数列 我们考虑什么样的点能够转移到 \(dp_i\)尝试借助 \(log\) 段…

Zerto 10.0 Update 6 下载 - 适用于本地、混合和多云环境的灾难恢复和数据保护

Zerto 10.0 Update 6 下载 - 适用于本地、混合和多云环境的灾难恢复和数据保护Zerto 10.0 U6 - 适用于本地、混合和多云环境的灾难恢复和数据保护 勒索软件防护、灾难恢复和多云移动性的统一解决方案 请访问原文链接:https://sysin.org/blog/zerto-10/ 查看最新版。原创作品,…

OpenWrt 24.10 OVF:在 ESXi 8.0、Fusion 13 和 Workstation 17 上运行 OpenWrt 的简单方法

OpenWrt 24.10 OVF:在 ESXi 8.0、Fusion 13 和 Workstation 17 上运行 OpenWrt 的简单方法OpenWrt 24.10 OVF:在 ESXi 8.0、Fusion 13 和 Workstation 17 上运行 OpenWrt 的简单方法 OpenWrt 24.10.0 x86_64 OVF 请访问原文链接:https://sysin.org/blog/openwrt-ovf/ 查看最…

SQL Server 2022新功能:将数据库备份到S3兼容的对象存储

SQL Server 2022新功能:将数据库备份到S3兼容的对象存储 本文介绍将S3兼容的对象存储用作数据库备份目标所需的概念、要求和组件。 数据库备份和恢复功能在概念上类似于使用SQL Server备份到Azure Blob存储的URL作为备份设备类型。 要注意的是,不只是amazon S3对象存储,只要…

护眼神器!LightBulb电脑屏幕护眼软件,你值得拥有!

点击上方蓝字关注我 前言 LightBulb是一个免费的护眼软件,它可以帮助我们在晚上或长时间看电脑屏幕时,减少眼睛的不舒服和疲劳。这个软件会随着一天时间的推移,自动调整电脑屏幕的颜色。比如,在白天,它会让屏幕颜色更偏向冷蓝色,就像阳光下的颜色;到了晚上,它会让屏幕颜…

【JWT安全】攻防指南全面梳理

一、简单介绍 JWT(JSON Web Token)是一种用于身份认证和授权的开放标准,它通过在网络应用间传递被加密的JSON数据来安全地传输信息使得身份验证和授权变得更加简单和安全,JWT对于渗透测试人员而言可能是一种非常吸引人的攻击途径,因为它们不仅是让你获得无限访问权限的关键而…

【CodeForces训练记录】Codeforces Round 1003 (Div. 4)

训练情况赛后反思 题面读的有点疑惑,怀疑自己阅读理解不大行了,简单题狂WA,C2二分调半天没出,水平严重退步 A题 最后两个字母 us 换成 i点击查看代码 #include <bits/stdc++.h> // #define int long long #define endl \nusing namespace std;void solve(){string s;…

[流程图/技术调研] drawio : 流程图绘制工具

引言 流程图绘制工具: draw.io 简介urlhttps://www.drawio.com/ (官网首页) https://github.com/jgraph/drawio (github)【官网简介】 drawio 这个项目,是一个可配置的图表/白板可视化应用程序。drawio 是由 JGraph Ltd 和 draw AG 共同拥有和开发的。 在运行这个项目的同时,…

国家中小学智慧教育平台新教材及音频下载神器

点击上方蓝字关注我 前言 国家中小学智慧教育平台是一个专门给老师、孩子们提供学习资源的网站,上面有很多专业的教学视频、课件和教材。不过,这些学习资料都只能在网上看,如果没有网络就连不上了。 而这个下载器的作用就像是一个“搬运工”,它可以把这些网上的视频、课件和…

【牛客训练记录】牛客周赛 Round 80

训练情况赛后反思 玩了一两天发现自己水平直接下降一个档次,简单的C题模拟没写出来 A题 直接判断剩下还能放几个棋子,如果小于零就无法放置,否则直接输出即可点击查看代码 #include <bits/stdc++.h> // #define int long long #define endl \nusing namespace std;voi…