不接受RestEasy 406

时间:2019-01-17 10:36:32

标签: java rest api resteasy http-status-code-406

我正在测试我创建的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显然不能在没有正文的情况下发送发布请求。

1 个答案:

答案 0 :(得分:0)

这似乎是content negotiation的问题。来自mozilla project的HTTP 406的定义是:

超文本传输​​协议(HTTP)406不可接受的客户端错误 响应代码指示服务器无法产生响应 与请求中定义的可接受值列表匹配 主动的内容协商标头,并且该服务器是 不愿意提供默认表示。

实际上,您的端点定义它正在产生“ image / png” ,但是您的客户端正在接受 MediaType.TEXT_PLAIN

因此,如果令牌是图像,则需要将两者对齐;如果是令牌,则应更改服务器代码。