使用Jersey客户端进行POST操作

59
在Java方法中,我想使用Jersey客户端对象对RESTful Web服务进行POST操作(也是使用Jersey编写),但不确定如何使用客户端发送将用作FormParam的值到服务器。 我能够很好地发送查询参数。
6个回答

87

我自己还没有做过这个,但是通过Google搜索可以快速得到一个来自blogs.oracle.com的技术提示,上面有一些与你所询问的内容完全相符的例子。

以下示例源自该博客文章:

MultivaluedMap formData = new MultivaluedMapImpl();
formData.add("name1", "val1");
formData.add("name2", "val2");
ClientResponse response = webResource
    .type(MediaType.APPLICATION_FORM_URLENCODED_TYPE)
    .post(ClientResponse.class, formData);

需要帮忙吗?


53

从Jersey 2.x开始,MultivaluedMapImpl类被MultivaluedHashMap所替代。您可以使用它来添加表单数据并将其发送到服务器:

    WebTarget webTarget = client.target("http://www.example.com/some/resource");
    MultivaluedMap<String, String> formData = new MultivaluedHashMap<String, String>();
    formData.add("key1", "value1");
    formData.add("key2", "value2");
    Response response = webTarget.request().post(Entity.form(formData));

请注意,表单实体以"application/x-www-form-urlencoded"格式发送。


我是否仍需要使用URLEncoder.encode(value1, "UTF-8")对该值进行编码,还是form()会在内部处理正确的编码? - user1438038

18

它现在是Jersey客户端文档中的第一个示例。

示例5.1:使用表单参数的POST请求

Client client = ClientBuilder.newClient();
WebTarget target = client.target("http://localhost:9998").path("resource");

Form form = new Form();
form.param("x", "foo");
form.param("y", "bar");

MyJAXBBean bean =
target.request(MediaType.APPLICATION_JSON_TYPE)
    .post(Entity.entity(form,MediaType.APPLICATION_FORM_URLENCODED_TYPE),
        MyJAXBBean.class);

Jersey客户端是否会自动将返回类型转换为 MyJAXBBean.class?如何实现? - macemers
1
调用链的最后一个参数是一个类,告诉Jersey将响应内容映射到MyJAXBBean对象。您还可以将其映射为字符串,并使用您选择的工具进行反序列化。 - Olivier Tonglet
1
这是链接,如果有人仍在寻找 - https://eclipse-ee4j.github.io/jersey.github.io/documentation/latest/client.html#client.ex.formpost - Sankalp

6

如果您需要进行文件上传,您需要使用MediaType.MULTIPART_FORM_DATA_TYPE。看起来MultivaluedMap不能与之一起使用,因此这里提供了一个使用FormDataMultiPart的解决方案。

InputStream stream = getClass().getClassLoader().getResourceAsStream(fileNameToUpload);

FormDataMultiPart part = new FormDataMultiPart();
part.field("String_key", "String_value");
part.field("fileToUpload", stream, MediaType.TEXT_PLAIN_TYPE);
String response = WebResource.type(MediaType.MULTIPART_FORM_DATA_TYPE).post(String.class, part);

如果你不上传文本文件,你可能需要使用MediaType.APPLICATION_OCTET_STREAM_TYPE来处理流... - Lambart

3

最简单的方法:

Form form = new Form();
form.add("id", "1");    
form.add("name", "supercobra");
ClientResponse response = webResource
  .type(MediaType.APPLICATION_FORM_URLENCODED_TYPE)
  .post(ClientResponse.class, form);

2
此外,您也可以尝试这个:
MultivaluedMap formData = new MultivaluedMapImpl();
formData.add("name1", "val1");
formData.add("name2", "val2");
webResource.path("yourJerseysPathPost").queryParams(formData).post();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接