当我尝试执行以这种方式构造的代码时,我一直收到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)
答案 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);