Rest-Assured脚本PUT请求Hamcrest断言报错求助
问题分析与解决办法
核心问题
你的PUT请求实际没有返回任何JSON响应体(Content-Length: 0),但测试脚本依然尝试解析空响应体并断言msg字段,这直接导致了"The JSON input text should neither be null nor empty"异常。
可能的原因及对应解决办法
1. 后端PUT接口的设计就是无响应体(符合REST规范)
REST规范中,资源更新成功后允许返回204 No Content状态码,此时接口不会返回任何响应体,Content-Length为0是正常行为。
- 解决:
- 先确认接口文档的约定,如果是
204状态码的设计,移除对响应体msg字段的断言,改为断言状态码:given() .contentType(ContentType.JSON) .body(updateData) .when() .put("/your/endpoint/{id}", resourceId) .then() .statusCode(204); - 如果需要验证更新结果,可以后续发起GET请求,校验目标资源的字段是否已更新。
- 先确认接口文档的约定,如果是
2. 后端PUT接口存在bug,未正确返回响应体
后端处理PUT请求时,可能执行了更新逻辑,但未正确生成并返回包含msg字段的JSON响应(比如代码遗漏了响应输出、异常导致流程中断)。
- 解决:
- 查看后端服务日志,确认PUT请求是否被正常处理,是否有响应输出的相关报错;
- 直接用Postman/Curl调用该PUT接口,验证是否能得到预期的JSON响应,排除测试脚本的问题;
- 协同后端开发排查接口代码,确保更新成功后正确序列化返回响应体。
3. PUT请求本身不合法,导致后端无响应返回
比如请求参数错误、认证失败、路径拼写错误等,后端可能返回了无响应体的错误状态码(如400、401),但你的脚本未先校验状态码就直接解析响应体。
- 解决:
- 在脚本中先断言响应状态码是否符合预期(比如200),再处理响应体:
given() .contentType(ContentType.JSON) .body(updateData) .when() .put("/your/endpoint/{id}", resourceId) .then() .statusCode(200) // 先确保状态码正确 .body("msg", equalTo("Address successfully updated")); - 查看请求日志中的请求头、请求体,确认是否和后端接口要求一致(比如Content-Type是否为application/json,参数是否完整)。
- 在脚本中先断言响应状态码是否符合预期(比如200),再处理响应体:
内容的提问来源于stack exchange,提问作者mangesh
相关产品推荐
相关产品推荐

