Jersey / JAX-RS客户端抛出400个错误请求

时间:2014-12-22 18:50:37

标签: java json jersey jax-rs

我有一个使用Jersey构建的RESTful Java Web服务。它的客户端使用以下方法定义资源:

@Override
public String saveWidget(Widget widget) {
    return webResource.path("user").type(MediaType.APPLICATION_JSON).entity(widget).post(String.class, Widget.class);
}

然后,使用此客户端的驱动程序:

public class Driver {
    public static void main(String[] args) {
        WidgetClient client;
        WidgetClientBuilder builder = new WidgetClientBuilder();
        client = builder.withUri("http://localhost:8080/myapi").build();

        Widget w = getSomehow();

        String widgetUri = client.getWidgetResource().saveWidget(w);
        System.out.println("Widget was saved URI was returned: " + widgetUri);
    }
}

当我跑步时,我得到:

Exception in thread "main" com.sun.jersey.api.client.UniformInterfaceException: POST http://localhost:8080/myapi/widget returned a response status of 400 Bad Request
    at com.sun.jersey.api.client.WebResource.handle(WebResource.java:688)
    at com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74)
    at com.sun.jersey.api.client.WebResource$Builder.post(WebResource.java:570)
    at com.my.myapi.WidgetResource.saveWidget(WidgetResource.java:27)
    at com.my.myapi.Driver.main(Driver.java:32)

我知道服务端点是有效的,因为我可以从另一个(非Java)Web客户端点击它而没有问题。这意味着我的Widget实例格式不正确或者我的Java客户端方法(saveWidget)存在问题。我排除了w Widget的错误,将其序列化为JSON,然后将其复制到我的非Java Web客户端并POST到同一个端点(没有出现问题)。所以这告诉我我的客户端方法配置错误。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

这是关于使用Jersey客户端进行POST呼叫。

对于泽西客户端,默认客户端配置使用ChunkedEncoding和gzip。这可以在POST调用的请求标头中检查。有效载荷的内容长度(JSON字符串或任何对象映射器pojo)和通过邮件调用接收的请求标头,即标题名称CONTENT-LENGTH,CONTENT-ENCODING。如果有差异,POST调用可能会返回400错误请求。 (像无法处理JSON的东西)。要解决此问题,您可以禁用ChunkedEncoding,gzip编码。相同的代码段:

clientConfiguration.setChunkedEncodingEnabled(false);
clientConfiguration.setGzipEnabled(false);

Client client = (new JerseyClientBuilder(environment)).using(clientConfiguration).using(environment).build("HTTP_CLIENT");
WebTarget webTarget = client.target(endpoint);
Response response = webTarget.path(path).request(MediaType.APPLICATION_JSON).post(Entity.json(jsonString));

答案 1 :(得分:1)

  

.post(String.class, Widget.class );

您似乎发布了一个Class对象,而不是Widget对象。