You need to enable JavaScript to run this app. Java接口测试中加载JSON文件作为POST请求体时报400错误,无法读取payload
优惠活动
大模型
产品
解决方案
定价
更多

Java接口测试中加载JSON文件作为POST请求体时报400错误,无法读取payload

「Unable to read payload from File」报错修复指南

问题根源

报错提示和400 Bad Request是两个问题叠加触发的:

  1. 本地文件路径解析失效
    • 写的相对路径.\\JSONFileinput\\file.json完全依赖JVM启动时的工作目录,IDE执行测试用例时的工作目录经常不是项目根目录,会直接定位不到文件,触发读取失败的提示。
    • 路径里用Windows专属的\\分隔符,跨操作系统执行测试时会直接出现路径解析错误。
  2. RestAssured 请求体传参逻辑错误
    • 直接把File对象传给普通JSON请求的.body()方法时,RestAssured不会自动解析读取文件内的文本,反而会把File对象作为普通POJO做JSON序列化,最终发出去的请求体只会包含文件路径、长度等元数据,完全不是预期的接口参数,自然会被服务端判定为坏请求。

落地修复方案

  • 优先解决文件定位的可靠性
    不要硬编码相对路径,推荐把JSON文件放到测试资源目录下(src/test/resources/JSONFileinput/file.json),通过类路径加载定位文件,彻底避免工作目录偏移的问题:
    File jsonBody = new File(getClass().getClassLoader().getResource("JSONFileinput/file.json").getFile());
    // 路径校验,快速排查文件不存在的问题
    System.out.println("文件实际解析路径:" + jsonBody.getAbsolutePath());
    System.out.println("文件存在性:" + jsonBody.exists());
    
  • 正确传参设置请求体
    不要直接把File对象传给.body(),要先读取文件内的文本内容再传入:
    // RestAssured 内置工具读取文件内容
    String jsonPayload = FileReader.reader(jsonBody).asString();
    Response resp = given()
        .header("Content-Type","application/json")
        .body(jsonPayload)
        .log()
        .all()
        .post("https://restful-booker.herokuapp.com/booking");
    resp.prettyPrint();
    
    如果不想依赖RestAssured的工具类,也可以用JDK原生的Files API读取文件内容:
    String jsonPayload = new String(Files.readAllBytes(jsonBody.toPath()));
    
  • 最后校验JSON文件本身的合法性
    确认file.json内的内容是无语法错误的标准JSON(没有多余逗号、代码注释、编码乱码),避免文件能正常读取但格式不对触发400错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.05 10:36:02