Java接口测试中加载JSON文件作为POST请求体时报400错误,无法读取payload
「Unable to read payload from File」报错修复指南
问题根源
报错提示和400 Bad Request是两个问题叠加触发的:
- 本地文件路径解析失效
- 写的相对路径
.\\JSONFileinput\\file.json完全依赖JVM启动时的工作目录,IDE执行测试用例时的工作目录经常不是项目根目录,会直接定位不到文件,触发读取失败的提示。 - 路径里用Windows专属的
\\分隔符,跨操作系统执行测试时会直接出现路径解析错误。
- 写的相对路径
- 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的工具类,也可以用JDK原生的// 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();FilesAPI读取文件内容:String jsonPayload = new String(Files.readAllBytes(jsonBody.toPath())); - 最后校验JSON文件本身的合法性
确认file.json内的内容是无语法错误的标准JSON(没有多余逗号、代码注释、编码乱码),避免文件能正常读取但格式不对触发400错误。
内容的提问来源于stack exchange,提问作者Gurumurthy S
相关产品推荐
相关产品推荐

