当前位置: 首页 > 知识库问答 >
问题:

使用JAX-RS客户端从REST服务下载文件

赵开诚
2023-03-14

我试图使用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();
}

然而,我面临着将响应转换为实际文件对象的问题。所以我所做的是以下几点:

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;
}

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

Superstore.TWB YSI 7 D M 3 F



编辑:引用关于HTTP响应的REST API引用:

反应体

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

工作簿的内容为。twb格式(content-type:application/xml)
工作簿的内容为。twbx格式(content-type:application/octet-stream

共有1个答案

孔俊友
2023-03-14

正如您自己注意到的,这里处理的是二进制数据。所以不应该从响应中创建字符串。最好获取输入流,并将其管道到您的文件。

Response response = invokeDownload(authToken, url);
InputStream in = response.readEntity(InputStream.class);
Path path = Paths.get(savePath, filename);
Files.copy(in, path);
 类似资料:
  • 我正在使用泽西JAX-RS客户端(版本2.0)。我知道它使用Jackson ObjectMapper来生成和解析JSON。我想使用相同的对象为一些java类生成JSON,这样我就可以将它们写入日志。 我知道我可以创建一个新的ObjectMapper实例,但我更喜欢请求泽西客户端给我一个它正在使用的引用。我该怎么做呢?泽西2.0知道Jackson,因为它包含一个JacksonFeature类,该类首

  • 我正在开发一个安全的web应用程序,它可以进行金融交易,并在其中使用spring。哪个更适合用于安全性、JAX-RS服务或SpringREST服务?我考虑使用spring,因为我们已经在应用程序中使用它了,如果它提供了功能,那么为什么要使用JAX-RS,但正如我所说的,它是一个高度安全的web应用程序,人们将在其中购买东西并进行金融交易,所以我必须看看哪个更适合使用。 我看了下面的博客还是有点困惑

  • 我试图在was 8.5上部署使用jersey的jax-rs客户机应用程序。 我希望我不需要在war中打包jersey JAR,因为was将提供它们。 但在试图调用servlet时,我遇到了这个错误: 我可以做些什么来使用was库,这样我就不需要把它们打包在我的应用程序中了吗?

  • 问题内容: 我正在尝试从Spring Boot Rest服务下载文件。 当我尝试从浏览器下载文件时,它开始下载,但始终失败。服务有什么问题导致下载失败? 问题答案: 仅当没有其他特定的资源实现适用时才应使用。特别是,尽可能选择ByteArrayResource或任何基于文件的Resource实现。 Option2作为InputStreamResource的文档建议-使用ByteArrayResou

  • 在这小节中将演示如何通过JAX-RS API下载java中的文本文件,图像文件,pdf文件和excel文件。 为此需要编写几行代码。 在这里使用 jersey 实现来开发JAX-RS文件下载示例。 首先打开Eclipse,创建一个动态Web项目:JaxRsFileDownload 。项目结构如下图所示 - Jersey Jar文件下载网址:https://jersey.github.io/down

  • 问题内容: 鉴于这些问题 ,如果仍然存在,我深表歉意。这是该问题的另一个版本。 我的angular 1.5.X客户端为我提供了标题列表,每个标题都有一个关联的文件。我的Node 4.X / Express 4.X服务器使用该列表,获取文件位置,使用npm中的express-zip创建一个zip文件,然后将该文件流式传输回响应中。然后,我希望我的客户端启动浏览器的“下载文件”选项。 这是我的客户代码