我正在测试我创建的REST服务,该服务不断给我错误:接受标头不匹配
@POST
@Path("token/{tid}/used")
@Consumes(MediaType.TEXT_PLAIN)
@Produces("image/png")
public Response useTokens(@PathParam("tid") String tokenId, String input) {
try {
String test = input + "test";
if (tokenService.useToken(tokenId)) {
return Response.accepted().entity(tokenService.getTokenImage(tokenId)).build();
} else if (!tokenService.useToken(tokenId)) {
return Response.status(Response.Status.FORBIDDEN).entity("Token already used or wrong token id").build();
}
}catch(Exception e){
return Response.status(Response.Status.NOT_FOUND).entity("Token not found").build();
}
return null;
}
}
我的测试看起来像
String tokenId = "12345234";
RestClient useTokenClient = new RestClient("http://localhost:8080/token/");
String url = String.format("%s/used", tokenId);
String trigger = "trigger resteasy";
tokenResponse = this.useTokenClient.post(url, trigger, MediaType.TEXT_PLAIN);
我实际上并不需要测试类中的String触发器或我的API中的String输入,但是RestEasy显然不能在没有正文的情况下发送发布请求。
答案 0 :(得分:0)
这似乎是content negotiation的问题。来自mozilla project的HTTP 406的定义是:
超文本传输协议(HTTP)406不可接受的客户端错误 响应代码指示服务器无法产生响应 与请求中定义的可接受值列表匹配 主动的内容协商标头,并且该服务器是 不愿意提供默认表示。
实际上,您的端点定义它正在产生“ image / png” ,但是您的客户端正在接受 MediaType.TEXT_PLAIN 。
因此,如果令牌是图像,则需要将两者对齐;如果是令牌,则应更改服务器代码。