如何查看Ktor生成发送的JSON请求体以排查400请求错误
查看Ktor客户端实际发送JSON请求体的方案
Ktor客户端默认不读取系统代理配置,这是你之前用系统代理类抓包工具、Postman无法捕获请求的核心原因,用以下方法可以直接拿到真实发送的请求内容:
方案1:安装Ktor内置日志插件(最推荐)
不需要额外配置代理、安装HTTPS证书,直接在HttpClient初始化时安装Logging插件,配置报文打印级别为BODY,即可在控制台看到完整的请求、响应原文,和实际发出的内容完全一致。
配置参考:// 提前引入对应客户端引擎的日志依赖,比如CIO引擎对应io.ktor:ktor-client-logging-cio val client = HttpClient(CIO) { // 替换为你项目实际使用的客户端引擎,如OkHttp、Java等 install(Logging) { level = LogLevel.BODY // 配置为打印完整请求/响应体 } // 你原有的JSON序列化、超时等配置保持不变即可 }发起请求后控制台会直接输出完整的JSON请求体,直接和接口要求的格式逐字段比对即可定位问题。
方案2:手动序列化提前校验
直接使用项目中Ktor绑定的同配置序列化器,提前将待发送的实体对象转成JSON字符串打印,不需要发起请求就能看到序列化结果。
以kotlinx.serialization为例:// 构造和setBody中完全一致的请求对象 val req = PostInvoiceResult( PostInvoiceResultInside( PostInvoiceResultInsideCustomer(pennylaneId), listOf(PostInvoiceResultInsideLineItems("API", 1, furiousInvoice.amount_inc_tax, "1", "FR_200")), furiousInvoice.invoice_date, furiousInvoice.due_date, "F" + furiousInvoice.id ), "false", pdf_base64 ) // 注意必须使用和Ktor JsonFeature配置完全相同的Json实例,保证序列化规则一致 val realJson = Json.encodeToString(req) println("真实序列化结果:$realJson")高频400问题排查点
结合你给出的接口格式要求,优先排查这几个序列化常见问题:- 字段名映射问题:默认序列化会输出字段的变量名,如果你的实体类用了驼峰命名(比如
currencyAmount),没有配置全局下划线命名转换、或者没有加@SerialName/@JsonProperty注解指定接口要求的下划线字段名,就会出现字段不匹配 - 类型不匹配:比如数值类型
quantity被序列化成浮点数1.0、布尔字段你当前传的是字符串"false"而非布尔值false - 空值处理问题:如果序列化配置默认输出null值,而接口不接受null字段,也会触发400响应
- 字段名映射问题:默认序列化会输出字段的变量名,如果你的实体类用了驼峰命名(比如
内容的提问来源于stack exchange,提问作者Poui
相关产品推荐
相关产品推荐

