Jersey UniformInterfaceException尝试代理REST POST服务

时间:2012-09-19 20:16:44

标签: java rest post firefox-addon jersey

当我尝试执行以这种方式构造的代码时,我一直收到406 HTTP响应。我已经尝试过多次重构代码和输入,但我仍然收到这个错误,而且我已经达到了我甚至不知道要调试的地步。该异常似乎表明post()方法未以所需格式提供@FormParam,但您可以看到.accept(MediaType.APPLICATION_FORM_URLENCODED)@Consumes(MediaType.APPLICATION_FORM_URLENCODED)确实匹配起来。

我使用Firefox附加组件HTTPRequester来传递@FormParam并确保我使用适当的Content-Type(application/x-www-form-urlencoded)传递它们。我已经没有东西要检查了。有没有人有任何想法?


代理服务

Client client = Client.create();
WebResource service = client.resource(myURL);

Form form = new Form();
form.add("value1", value1);
form.add("value2", value2);
form.add("valueN", valueN);

String returnValue = service.accept(MediaType.APPLICATION_FORM_URLENCODED).post(String.class, form);

实际服务

@POST
@Produces(MediaType.APPLICATION_XML)
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Path("/theService")
public String theService(
        @FormParam("value1") String value1,
        @FormParam("value2") String value2,
        @FormParam("valueN") String valueN) {

    String returnValue = null;

    /*
     * Do Stuff
     */

    return returnValue;
}

例外

com.sun.jersey.api.client.UniformInterfaceException: POST http://theURL/theService returned a response status of 406
at com.sun.jersey.api.client.WebResource.handle(WebResource.java:563)
at com.sun.jersey.api.client.WebResource.access$300(WebResource.java:69)
at com.sun.jersey.api.client.WebResource$Builder.post(WebResource.java:499)

1 个答案:

答案 0 :(得分:9)

UniformInterfaceException只是一个包含不良名称的全能异常(它的名字是因为它是一个提供统一接口的异常,无论错误如何)。它基本上是泽西岛的任何东西抛出的IOException。实际错误是406 Unacceptable

  

请求的资源只能根据请求中发送的Accept标头生成不可接受的内容。

这里你说你接受MediaType.APPLICATION_FORM_URLENCODED

String returnValue = service.accept(MediaType.APPLICATION_FORM_URLENCODED).post(String.class, form);

但您的服务会产生MediaType.APPLICATION_XML

@Produces(MediaType.APPLICATION_XML)

由于您的服务器无法生成客户端表示会接受的任何内容,因此会返回406错误。

最有可能的是,您需要设置WebResource.type,而不是accept

String returnValue = service.type(MediaType.APPLICATION_FORM_URLENCODED).post(String.class, form);