59

在 Java 方法中,我想使用 Jersey 客户端对象在 RESTful Web 服务(也使用 Jersey 编写)上执行 POST 操作,但不知道如何使用客户端发送将用作 FormParam 的值在服务器上。我能够发送查询参数就好了。

4

6 回答 6

87

我自己还没有这样做,但是快速了解一下 Google-Fu 会在 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);

那有什么帮助吗?

于 2010-01-25T22:30:58.413 回答
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"

于 2014-08-07T01:43:48.143 回答
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);
于 2015-03-18T07:01:09.997 回答
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);
于 2014-06-05T06:34:40.210 回答
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);
于 2014-10-02T23:57:09.387 回答
2

你也可以试试这个:

MultivaluedMap formData = new MultivaluedMapImpl();
formData.add("name1", "val1");
formData.add("name2", "val2");
webResource.path("yourJerseysPathPost").queryParams(formData).post();
于 2013-03-07T23:07:51.787 回答