【问题标题】:Using the Jersey client to do a POST operation使用 Jersey 客户端进行 POST 操作
【发布时间】:2010-01-25 22:22:37
【问题描述】:

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

【问题讨论】:

    标签: java jakarta-ee jersey


    【解决方案1】:

    我自己还没有这样做,但是快速浏览一下 Google-Fu 会发现 tech tip on 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);
    

    有什么帮助吗?

    【讨论】:

      【解决方案2】:

      从 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() 会在内部处理正确的编码?
      【解决方案3】:

      现在是Jersey Client documentation中的第一个例子

      示例 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 ?如何做到这一点?
      • 调用链的最后一个参数是一个类,告诉Jersey 将响应内容映射到一个MyJAXBBean 对象。您还可以将其映射到字符串并使用您自己选择的工具对其进行反序列化。
      【解决方案4】:

      如果您需要上传文件,则需要使用 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 进行流...
      【解决方案5】:

      最简单的:

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

      【讨论】:

        【解决方案6】:

        你也可以试试这个:

        MultivaluedMap formData = new MultivaluedMapImpl();
        formData.add("name1", "val1");
        formData.add("name2", "val2");
        webResource.path("yourJerseysPathPost").queryParams(formData).post();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-26
          • 2018-11-09
          • 2014-07-02
          • 1970-01-01
          • 2011-01-09
          相关资源
          最近更新 更多