起初在开发过程中,我遇到了一个困扰我的问题:当我将对象转换为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 -> {
//打印头和cookie
logger.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 技术这块儿的奥秘。特爱跟人交流技术,喜欢把自己的心得和大家分享。还当上了腾讯云创作之星,阿里云专家博主,华为云云享专家,掘金优秀作者。各种征文、开源比赛的牌子也拿了。

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

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

WebClient 获取不到请求体如何破解?的更多相关文章

  1. 在Express 中获取表单请求体数据

    在Express 中获取表单请求体数据 获取 GET 请求参数 获取 POST 请求体数据 安装 配置 获取 GET 请求参数 Express 内置了一个 API , 可以直接通过 req.query ...

  2. Servlet获取POST方法请求体数据

    if ("POST".equalsIgnoreCase(request.getMethod())) { test = request.getReader().lines().col ...

  3. 获取【请求体】数据的3种方式(精)(文末代码) request.getInputStream() request.getInputStream() request.getReader()

    application/x- www-form-urlencoded是Post请求默认的请求体内容类型,也是form表单默认的类型.Servlet API规范中对该类型的请求内容提供了request. ...

  4. java web获取请求体内容

    Java Web中如何获取请求体内容呢? 我们知道请求方式分为两种:Get,Post. /*** * Compatible with GET and POST * * @param request * ...

  5. Flask中获取参数(路径,查询,请求体,请求头)

    上一篇中已经讲述了:HTTP协议向服务器传参有几种途径{ 链接 } 在Flask中同样通过这4中传参途径进行归纳: 1. URL中路径参数的获取: 拓展: # 路由参数/路径参数:http://127 ...

  6. Django中获取参数(路径,查询,请求头,请求体)

    一.通常HTTP协议向服务器传参有几种途径 : 提取URL的特定部分,如/weather/shanghai/2018,可以在服务器端的路由中用正则表达式截取: 查询字符串(query string), ...

  7. SpringMvc获取前端的数据@RequestBody请求体/@PathVaribale/@RequestParam【支持Ajax】

    一.@RequestBody请求体 注意请求体只有form表单才有,而对于链接来说不使用 1).在Controller中写 @RequestBody String body是基本用法 另外可以封装对象 ...

  8. Spring Cloud Gateway 之获取请求体(Request Body)的几种方式

    Spring Cloud Gateway 获取请求体 一.直接在全局拦截器中获取,伪代码如下 private String resolveBodyFromRequest(ServerHttpReque ...

  9. 获取请求体数据 POST

    POST获取请求体 请求体中封装了 POST请求的请求参数 获取流对象 再从流对象中那数据 一种字节流 一种字符流 BufferedReader getReader()获取字符输入流 只能操作字符 S ...

  10. 从Excel获取请求体

    Excel文件 .py文件---------------------- import xlrdimport re def fetch_body(path,sheet,name,adict):     ...

随机推荐

  1. 轻量数据库管理工具之adminer

    github: https://github.com/vrana/adminer 官方文档:https://www.adminer.org/#download Supports: MySQL, Mar ...

  2. python常用模块汇总

    os模块 os.remove() 删除文件 os.unlink() 删除文件 os.rename() 重命名文件 os.listdir() 列出指定目录下所有文件 os.chdir() 改变当前工作目 ...

  3. 抓包工具之Charles(mac)

    下载地址:https://www.charlesproxy.com/download/ 因为软件是收费的,所以破解方式可以参考:https://www.zzzmode.com/mytools/char ...

  4. word 文档签章控件生成的签章批量删除

    某个签章工具的word插件缺少批量插入签章的功能.同时,发现在投标工具中可以使用导出生成pdf时批量签章的功能.现在需要移除先前手动操作生成的多个签章,有如下发现-- 1.对少量签章,可以先选中签章右 ...

  5. 从零开始的Python世界生活——基础篇(Python字典)

    从零开始的Python世界生活--基础篇(Python字典) 1.Python字典是什么? ​ Python字典是python中非常重要的非常灵活和强大的内置数据结构,用于存储键值对(key-valu ...

  6. Codeforces Round 901 (Div

    C. Jellyfish and Green Apple 题解 显然\(n \% m =0\),答案一定为\(0\) 如果\(n > m\),我们显然可以将\(n / m\)的苹果分给每个人,然 ...

  7. .NET Core 异步(Async)底层原理浅谈

    简介 多线程与异步是两个完全不同的概念,常常有人混淆. 异步 异步适用于"IO密集型"的场景,它可以避免因为线程等待IO形成的线程饥饿,从而造成程序吞吐量的降低. 其本质是:让线程 ...

  8. Vue.js vuex

    1.前言 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式,它解决了vue中不同组件之间状态共享的问题. 通俗的说,它就是一个带响应式的全局变量管理,它数据的改变会触发相关页面/组件的更 ...

  9. fiddler:The system proxy was changed.Click to reenable capturing

    前情 最近在开发一个老旧项目,由于本地环境已难跑起,于是想通过代理线上代码进行功能开发. 坑位 启动fiddler后,fiddler菜单栏会警告,大概意思是代理被更改了,点击重启fillder代理,但 ...

  10. 鸿蒙UI开发快速入门 —— part11: 鸿蒙计算器开发实践

    1.前言 经过我们前面10章的学习,我们基本上可以开发出一个简单的APP了,为了巩固学习的内容,我们先开发一个计算器APP来连个手(文末有源代码),界面如下: 包含基本的计算器运算功能 支持一键清空, ...