【问题标题】:Jersey REST Client : Posting MultiPart dataJersey REST 客户端:发布多部分数据
【发布时间】:2015-02-26 23:23:57
【问题描述】:

我正在尝试编写一个 Jersey 客户端应用程序,它可以将多部分表单数据发布到 Restful Jersey 服务。我需要发布一个包含数据的 CSV 文件和一个包含元数据的 JSON。我正在使用泽西客户端 1.18.3。这是我的代码(某些名称已更改为公司机密)...

Client client = Client.create();
WebResource webResource = client.resource("http://localhost:8080/mariam/service/playWithDad");


    FileDataBodyPart filePart = new FileDataBodyPart("file", 
            new File("C:/Users/Admin/Desktop/input/games.csv"));

    String playWithDadMetaJson
    = "{\n"
    + "    \"sandboxIndicator\": true,\n"
    + "    \"skipBadLines\": false,\n"
    + "    \"fileSeparator\": \"COMMA\",\n"
    + "    \"blockSize\": false,\n"
    + "    \"gameUUID\": \"43a004c9-2130-4e75-8fd4-e5fccae31840\",\n"
    + "    \"useFriends\": \"false\"\n"
    + "}\n"
    + "";

    MultiPart multipartEntity = new FormDataMultiPart()
    .field("meta", playWithDadMetaJson, MediaType.APPLICATION_JSON_TYPE)
    .bodyPart(filePart);

    ClientResponse response = webResource.type(MediaType.MULTIPART_FORM_DATA_TYPE).post(multipartEntity);

现在我在最后一行收到一个编译错误,说它无法从 void 转换为 ClientResponse。

我之前从这篇文章中得到了一些关于 RestFul 服务本身的指导。

Java Rest Jersey : Posting multiple types of data (File and JSON)

【问题讨论】:

    标签: java rest jersey multipartform-data jersey-client


    【解决方案1】:

    关注jersey documentation,他们提供示例客户端代码。这是发布多部分请求的 sn-p:

    final MultiPart multiPartEntity = new MultiPart()
            .bodyPart(new BodyPart().entity("hello"))
            .bodyPart(new BodyPart(new JaxbBean("xml"), MediaType.APPLICATION_XML_TYPE))
            .bodyPart(new BodyPart(new JaxbBean("json"), MediaType.APPLICATION_JSON_TYPE));
    
    final WebTarget target = // Create WebTarget.
    final Response response = target
            .request()
            .post(Entity.entity(multiPartEntity, multiPartEntity.getMediaType()));
    

    【讨论】:

    • 您的代码(和文档链接)是 Jersey 2。OP 正在使用 Jersey 1 :-)
    • @peeskillet 客户端代码版本并不重要,只要客户端正确构建 POST 多部分请求。
    【解决方案2】:

    “现在我在最后一行收到一个编译错误,说它无法从 void 转换为 ClientResponse。”

    查看WebResource 的javadoc。看看post(Object) (with Object arg)。它返回 void。

    您需要使用重载的post(Class returnType, requestEntity),它返回returnType 类型的实例。

    所以你应该做类似的事情

    ClientResponse response = webResource
            .type(MediaType.MULTIPART_FORM_DATA_TYPE)
            .post(ClientResponse.class, multipartEntity);
    

    【讨论】:

    • 嗨 Peeskillet,在服务器端,此客户端调用的服务方法是 public PlayWithDataVO provideService(@FormDataParam("meta") String jsonMeta, @FormDataParam("data") InputStream file),但是我看到 InputStream 参数为空,尽管 json 字符串正在通过。有什么建议吗?
    • 没关系,我想通了。我错过了应该与 FormDataParam 同名的 FormDataContentDisposition
    猜你喜欢
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2018-01-19
    • 1970-01-01
    相关资源
    最近更新 更多