【问题标题】:Jersey/JAX-RS Client throwing 400 Bad RequestJersey/JAX-RS 客户端抛出 400 错误请求
【发布时间】:2014-12-22 18:50:37
【问题描述】:

我有一个使用 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 客户端并发布到同一个端点(没有出现问题)来排除我的w Widget 坏了。所以这告诉我我的客户端方法配置错误。有什么想法吗?

【问题讨论】:

  • 这里没有足够的信息,发布或链接小部件类,成功的非java请求以及您注册的任何消息正文阅读器

标签: java json jersey jax-rs


【解决方案1】:

这是关于使用 Jersey 客户端拨打电话 POST 电话。

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

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));

【讨论】:

    【解决方案2】:

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

    您似乎发布的是 Class 对象,而不是 Widget 对象。

    【讨论】:

    • 谢谢@Don Bottstein (+1) - 你是说我的post 应该看起来像.post(String.class, widget);?如果是这样,那么.entity(widget) builder 方法的意义何在?再次感谢!
    • 啊,错过了entity 的电话。我认为您的post(...) 可能会覆盖entity()。您可能想做.entity(widget).post(String.class) 或只是post(String.class, widget)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 1970-01-01
    • 2017-05-05
    相关资源
    最近更新 更多