我试图使用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();
}
Run Code Online (Sandbox Code Playgroud)
但是,我遇到将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;
}
Run Code Online (Sandbox Code Playgroud)
创建的文件无效,我调试了代码并注意到输出包含类似的字符串(更大):
PK͢ F [Superstore.twb ysI 7 dߡ m3 f
看起来像二进制.显然代码有问题.
如何从Response对象获取HTTP响应主体作为字符串?
编辑:
引用来自REST API参考的HTTP响应:
响应机构
以下之一,具体取决于工作簿的格式:
.twb格式的工作簿内容(Content-Type:application/xml)
.twbx格式的工作簿内容(Content-Type:application/octet-stream)
正如您自己注意到的那样,您在这里处理二进制数据.因此,您不应该从响应中创建String.最好获取输入流并将其传输到您的文件中.
Response response = invokeDownload(authToken, url);
InputStream in = response.readEntity(InputStream.class);
Path path = Paths.get(savePath, filename);
Files.copy(in, path);
Run Code Online (Sandbox Code Playgroud)