我有一个使用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到同一个端点(没有出现问题)。所以这告诉我我的客户端方法配置错误。有什么想法吗?
答案 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对象。