【发布时间】:2015-10-03 13:17:46
【问题描述】:
我正在尝试使用 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 响应正文作为字符串?
编辑:
引用关于 HTTP 响应的 REST API 参考:
响应正文
以下之一,具体取决于工作簿的格式:
.twb 格式的工作簿内容(内容类型:application/xml)
.twbx 格式的工作簿内容(Content-Type:application/octet-stream)
【问题讨论】:
-
您的文件似乎不是文本文件。因此,从它创建一个字符串不是一个好主意。而是使用
response.getInputStream()并将其写入文件,例如使用 Apache Commons 的IOUtils.copy(in, out)。 -
@SebastianS 你应该回答这个问题。
-
那个输出看起来很像一个 zip 文件。
-
@Samuel 我不确定这是否是唯一原因(检索到的文件实际上仍可能是文本文件)。现在添加这个作为答案。