Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Download file from REST service using JAX-RS client

Tags:

java

jax-rs

I am trying to download a file from a REST service using JAX-RS. This is my code which invokes the download by sending a GET request:

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

However I am facing problems converting the Response into an actual File object. So what I did is the following:

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

The file which is created is not valid, I debugged the code and noticed that output contains a String like that (much larger):

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

Looks like binary. Obviously there is something wrong with the code.

How do I get the HTTP response body as a string from the Response object?



Edit: Quote from the REST API reference about the HTTP response:

Response Body

One of the following, depending on the format of the workbook:

The workbook's content in .twb format (Content-Type: application/xml)
The workbook's content in .twbx format (Content-Type: application/octet-stream)

like image 359
lenny Avatar asked Jul 14 '15 18:07

lenny


1 Answers

As you noticed yourself, you're dealing with binary data here. So you shouldn't create a String from your response. Better get the input stream and pipe it to your file.

Response response = invokeDownload(authToken, url);
InputStream in = response.readEntity(InputStream.class);
Path path = Paths.get(savePath, filename);
Files.copy(in, path);
like image 188
Sebastian S Avatar answered Sep 17 '22 12:09

Sebastian S