PATCH空请求体接口测试报AssertionFailedError:预期204实际返回415
问题根因
你遇到的415错误核心原因是请求配置和服务端接口定义不匹配:
- 你的API明确不需要请求体,但你的测试代码要么主动传递了JSON格式的请求体,要么请求头配置不符合服务端预期
- 日志中
No message body reader has been found for class java.lang.Object, ContentType: application/json是服务端CXF框架抛出的:服务端收到了Content-Type: application/json的请求,但接口没有定义对应的请求体参数,框架找不到匹配的反序列化处理器,直接返回415
修复方案
按优先级尝试以下修改即可:
1. 无请求体PATCH请求的标准写法
不需要请求体时不要传递任何Entity,同时204响应本身没有响应体,也不需要指定接收JSON类型的响应:
WebTarget webTarget = ClientBuilder.newClient().target(baseUrl).path(path); webTarget.property(HttpUrlConnectorProvider.SET_METHOD_WORKAROUND, true); // 不需要指定request的MediaType,204无响应体无需声明接收格式 Invocation.Builder invocationBuilder = webTarget.request(); // 直接调用PATCH方法,不传任何Entity final Response response = invocationBuilder.method("PATCH"); assertEquals(204, response.getStatus(), "should return 204 empty response");
2. 服务端强制要求带Content-Type的适配写法
部分框架的PATCH实现要求必须携带Content-Type头,可以显式设置为非JSON的兼容类型,避免触发JSON反序列化校验:
final Response response = invocationBuilder.method("PATCH", Entity.entity(null, MediaType.APPLICATION_OCTET_STREAM_TYPE));
3. 服务端配置校验(可选)
如果以上客户端修改无效,检查服务端PATCH接口的注解:确认没有错误添加@Consumes(MediaType.APPLICATION_JSON)注解,如果接口不需要消费请求体,要么去掉@Consumes注解,要么改为@Consumes(MediaType.WILDCARD)兼容所有内容类型。
内容的提问来源于stack exchange,提问作者earachefl
相关产品推荐
相关产品推荐

