使用JAX-RS客户端

时间:2015-07-14 18:27:33

标签: java jax-rs

我正在尝试使用JAX-RS从REST服务下载文件。 这是我的代码,它通过发送GET请求来调用下载:

private Response invokeDownload(String authToken, String url) {
    // Creates the HTTP client object and makes the HTTP request to the specified URL
    Client client = ClientBuilder.newClient();
    WebTarget target = client.target(url);

    // Sets the header and makes a GET request
    return target.request().header("X-Tableau-Auth", authToken).get();
}

但是,我遇到将Response转换为实际File对象的问题。所以我做的是以下内容:

public File downloadWorkbook(String authToken, String siteId, String workbookId, String savePath)
        throws IOException {
    String url = Operation.DOWNLOAD_WORKBOOK.getUrl(siteId, workbookId);
    Response response = invokeDownload(authToken, url);

    String output = response.readEntity(String.class);
    String filename; 
// some code to retrieve the filename from the headers
    Path path = Files.write(Paths.get(savePath + "/" + filename), output.getBytes());
    File file = path.toFile();
    return file;
}

创建的文件无效,我调试了代码并注意到输出包含类似的字符串(更大):

  

PK͢ F [Superstore.twb ysI 7 d m3 f

看起来像二进制文件。显然代码有问题。

如何从Response对象获取HTTP响应正文作为字符串?



修改 引用来自REST API参考的HTTP响应:

  

回复正文

     

以下之一,具体取决于工作簿的格式:

     

.twb格式的工作簿内容(内容类型: application / xml
  .twbx格式的工作簿内容(内容类型: application / octet-stream

2 个答案:

答案 0 :(得分:7)

正如您自己注意到的那样,您在这里处理二进制数据。所以你不应该从你的回复中创建一个String。最好获取输入流并将其传输到您的文件中。

Response response = invokeDownload(authToken, url);
InputStream in = response.readEntity(InputStream.class);
Path path = Paths.get(savePath, filename);
Files.copy(in, path);

答案 1 :(得分:2)

1)我假设你已经清楚“二进制文件”和“文本文件”之间的区别了。并且您只能将后者捕获为“字符串”。

2)塞巴斯蒂安为你提供了捕获二进制文件(+1,塞巴斯蒂安!)的绝佳建议。非常重要:在这种情况下,您应始终设置MIME类型(Content-Type: xxx/yyy)。 Here是另一个可能有用的链接。

3)最后,在某些情况下,您可能想要将“二进制”数据视为文本。这是电子邮件附件与SMTP(文本协议)一起使用的方式。在这些情况下,您要使用Base64 Encoding。例如:JAX-RS | Download PDF from Base64 encoded data