You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查看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问题排查点
    结合你给出的接口格式要求,优先排查这几个序列化常见问题:

    1. 字段名映射问题:默认序列化会输出字段的变量名,如果你的实体类用了驼峰命名(比如currencyAmount),没有配置全局下划线命名转换、或者没有加@SerialName/@JsonProperty注解指定接口要求的下划线字段名,就会出现字段不匹配
    2. 类型不匹配:比如数值类型quantity被序列化成浮点数1.0、布尔字段你当前传的是字符串"false"而非布尔值false
    3. 空值处理问题:如果序列化配置默认输出null值,而接口不接受null字段,也会触发400响应

内容的提问来源于stack exchange,提问作者Poui

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 10:36:16