泽西客户端多部分通话

Posted

技术标签:

【中文标题】泽西客户端多部分通话【英文标题】:Jersey Client for Mulipart call 【发布时间】:2017-01-26 18:10:21 【问题描述】:

我正在使用jersey 客户端对 API 进行 REST 调用,该 API 返回一个 Json 和一个多部分的 PDF 文件作为响应的第一和第二部分。

final Client client = ClientBuilder.newClient();
final WebTarget target = client.target(endPoint);
final Builder request = target.request().header("Authorization", authKey);
final Response response = request.get();
final String readEntity = response.readEntity(String.class);

这将返回带有字节码格式的 PDF 文件的字符串响应。 我试图将实体读取为 MultiPart 类,然后出现异常:

找不到媒体类型=multipart/form-data;boundary=------#### 和 客户端上的 getMediaType() 调用返回 multipart/form-data;boundary=------####。

使用上述客户端解析这个多部分响应的正确方法是什么?

【问题讨论】:

【参考方案1】:

快速的 Google 搜索可为您提供结果。您必须启用MultiPartFeature 并且您必须启用response.readEntity(InputStream.class)

从http://www.benchresources.net/jersey-2-x-web-service-for-uploadingdownloading-zip-file-java-client/得到以下代码

 // invoke service after setting necessary parameters
        clientConfig = new ClientConfig();
        clientConfig.register(MultiPartFeature.class);
        client =  ClientBuilder.newClient(clientConfig);
        client.property("accept", "application/zip");
        webTarget = client.target(httpURL);

        // invoke service
        invocationBuilder = webTarget.request();
        //          invocationBuilder.header("Authorization", "Basic " + authorization);
        response = invocationBuilder.get();

        // get response code
        responseCode = response.getStatus();
        System.out.println("Response code: " + responseCode);

        if (response.getStatus() != 200) 
            throw new RuntimeException("Failed with HTTP error code : " + responseCode);
        

        // get response message
        responseMessageFromServer = response.getStatusInfo().getReasonPhrase();
        System.out.println("ResponseMessageFromServer: " + responseMessageFromServer);

        // read response string
        inputStream = response.readEntity(InputStream.class);
        qualifiedDownloadFilePath = DOWNLOAD_FILE_LOCATION + "MyJerseyZippedFile.zip";
        outputStream = new FileOutputStream(qualifiedDownloadFilePath);
        byte[] buffer = new byte[1024];
        int bytesRead;
        while ((bytesRead = inputStream.read(buffer)) != -1) 
            outputStream.write(buffer, 0, bytesRead);
        

【讨论】:

因为我的响应中有一个 Json 后跟一个 PDF,所以 client.property 中的数据应该是什么? 它将是 API 的 @produces 包含的任何内容。你可以忽略它【参考方案2】:

希望下面的代码对你有所帮助。

Client client = Client.create();
client.addFilter(new HTTPBasicAuthFilter(username,password ))
WebResource webResource = client.resource("URL");
ClientResponse response = webResource.accept("*/*").type(MediaType.APPLICATION_OCTET_STREAM).get(ClientResponse.class);
Assert.assertEquals(response.getStatus(), 200);
MultivaluedMap<String, String> headers = response.getHeaders();
System.out.println("Content-Disposition  :" + headers.get("Content-Disposition"));
List<String> filename=headers.get("Content-Disposition");
file_name=filename.get(0);
file_name=file_name.substring(file_name.indexOf("\"")+1,file_name.lastIndexOf("\""));
File file=new File(file_name);
if(!file.exists()) 
    file.createNewFile();

InputStream inputStream=response.getEntityInputStream();
FileOutputStream fileStream =
        new FileOutputStream(file);
IOUtils.copy(inputStream, fileStream);
fileStream.flush();
fileStream.close();
Assert.assertTrue(file.length()>0);
//Deleting the backup file
file.delete();

【讨论】:

webResource 的数据类型是什么?

以上是关于泽西客户端多部分通话的主要内容,如果未能解决你的问题,请参考以下文章

泽西图像上传客户端

泽西 SSE 客户端不工作

泽西客户端异步 POST 请求不等待响应

客户端响应过滤器读取实体问题(泽西)

泽西岛客户端:如何添加列表作为查询参数

从泽西客户端调用 post API 时出现 415 错误