gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 07:43:47 24 4
gpt4 key购买 nike

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

@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)网络客户端访问它。这意味着我的 Widget 实例格式不正确,或者我的 Java 客户端方法 (saveWidget) 有问题。我通过将 w 小部件序列化为 JSON,然后将其复制到我的非 Java Web 客户端并发布到同一端点(没有出现问题)来排除我的 w 小部件有问题。所以这告诉我我的客户端方法配置错误。有什么想法吗?

最佳答案

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

对于 jersey 客户端,默认客户端配置使用 ChunkedEncoding 和 gzip。这可以在 POST 调用的请求 header 中检查。有效负载的内容长度(JSON 字符串或任何对象映射器 pojo)和调用后接收的请求 header ,即 header 名称 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));

关于java - Jersey/JAX-RS 客户端抛出 400 错误请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27608694/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com