JAX RS скачать PDF

Я пытаюсь загрузить PDF-файл, доступный по одному из остальных URL-адресов, используя JAX RS и Jersey с авторизацией.

import org.apache.commons.io.IOUtils;
import javax.net.ssl.*;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Invocation;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.Response;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.File;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;

public class ReportView {
    public void process(String authStringEnc) {

        System.setProperty("javax.net.ssl.trustStore","C:\\Users\\alim\\Desktop\\my-app\\stage\\npkeystore.jks");
        System.setProperty("javax.net.ssl.trustStorePassword","changeit");
        System.setProperty("javax.net.ssl.trustAnchors","C:\\Users\\alim\\Desktop\\my-app\\stage\\npkeystore.jks");

        Client client = ClientBuilder.newClient();
       // WebTarget target = client.target("https://x.x.x.x/api/profiler/1.0/reporting/reports/751252/").path("view");
        WebTarget target = client.target("https://x.x.x.x/api/profiler/1.0/reporting/reports/751252/view");

        Response resp = target.request("application/pdf,image/jpeg,application/xml,application/vnd.ms-excel").header("Authorization", authStringEnc).get(Response.class);


        System.out.println("Code : " + resp.getStatus());

        if(resp.getStatus() == Response.Status.OK.getStatusCode()) {
            InputStream is = resp.readEntity(InputStream.class);

            File downloadfile = new File("C://Users/alim/Downloads/view.pdf");
            try {

                byte[] byteArray = IOUtils.toByteArray(is);
                FileOutputStream fos = new FileOutputStream(downloadfile);
                fos.write(byteArray);
                fos.flush();
                fos.close();
            }catch(Exception e){
                e.getMessage();
            }

            IOUtils.closeQuietly(is);
            System.out.println("the file details after call:"+ downloadfile.getAbsolutePath()+", size is "+downloadfile.length());
        }
        else{
            throw new WebApplicationException("Http Call failed. response code is"+resp.getStatus()+". Error reported is"+resp.getStatusInfo());
        }
    }

Но приведенный выше фрагмент кода возвращает 400 Bad Request. Не уверен, что неправильно указал URL. Использование того же URL-адреса в Postman возвращает PDF-файл.

Exception in thread "main" javax.ws.rs.WebApplicationException: Http Call failed. response code is 400. Error reported is Bad Request

Также удаление блока сертификата возвращает мне исключение сертификации PKIX, хотя я уже определил его в основном классе и использовал его в одном из подклассов.

Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

Концепции JAX-RS и Jersey для меня довольно новы. Не уверен, где я ошибаюсь с точки зрения указания URL-адреса с аутентификацией, сертификатом и запросом.

Любая помощь/руководство по тому же самому действительно поможет.


person Alim Azad    schedule 22.11.2018    source источник
comment
Конечная точка тоже разработана вами? Можете ли вы поделиться кодом конечной точки?   -  person Bentaye    schedule 23.11.2018
comment
@Bentaye: Нет. Конечная точка — это инструмент для составления отчетов netprofiler русла реки, который извлекает отчеты. Ссылка: support.riverbed.com/apis/profiler/1.0/service .html), где остальные вызовы API для получения отчетов упоминаются https://{device}/api/profiler/1.0/reporting/reports/{report_id} . Чтобы просмотреть отчеты с графическим интерфейсом в браузере, необходимо нажать URL https://{device}/api/profiler/1.0/reporting/reports/{report_id}/view . Мне нужно скачать просмотренный отчет в формате PDF. Пожалуйста, направляйте.   -  person Alim Azad    schedule 24.11.2018
comment
Ниже я указал запрос для того же stackoverflow.com/questions/24716357/   -  person Alim Azad    schedule 24.11.2018
comment
Не могли бы вы попробовать этот URL-адрес http://enos.itcollege.ee/~jpoial/java/naited/pildid/corejava.pdf, чтобы убедиться, что вы можете загружать PDF-файлы (заголовок авторизации не требуется)   -  person Bentaye    schedule 26.11.2018


Ответы (2)


Может быть комментарий, но не может отформатировать его в комментарии.

Читая документ, я вижу, что

  1. Получить данные отчета.

После завершения отчета клиент может получить свои данные или обработанную версию отчета в нескольких форматах.

Для получения готовой версии отчета можно использовать следующие ресурсы:

/profiler/1.0/reporting/reports/{id}/view.pdf
/profiler/1.0/reporting/reports/{id}/view.csv

Это для версий PDF и CSV соответственно.

Не могли бы вы попробовать

WebTarget target = client
    .target("https://x.x.x.x/api/profiler/1.0/reporting/reports/751252/view.pdf");
Response resp = target
    .request("application/pdf,image/jpeg,application/xml,application/vnd.ms-excel")
    .header("Authorization", authStringEnc)
    .get(Response.class);
person Bentaye    schedule 25.11.2018
comment
Нет, все та же проблема. Есть ли другой способ загрузить файл с помощью HttpsURLConnection с аутентификацией? - person Alim Azad; 26.11.2018

Я попробовал наоборот и смог загрузить файлы PDF. Ниже приведен фрагмент кода для того же файла .

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;


        String download_url = "https://x.x.x.x/api/profiler/1.0/reporting/reports/" + reportID +"/view";
        String name = "report";
        String password = "report";
        String authString = name + ":" + password;
        String authStringEnc = Base64.getEncoder().encodeToString(authString.getBytes());

        System.out.println(" Downloading " + name + " report");

        Client restClient = Client.create();
        WebResource webResource = restClient.resource(download_url);
        ClientResponse resp = webResource.header("Authorization", "Basic " + authStringEnc)
                .get(ClientResponse.class);


        if(resp.getStatus() != 200){
            System.err.println(" Failed : HTTP error code : " + resp.getStatus());
        }
        else
        {
            System.out.println(" Response : " + resp.getStatus() + " OK. Successfully Connected");
        }

        InputStream is = resp.getEntityInputStream();
        OutputStream os = new FileOutputStream(curDir + "\\" + country.toLowerCase() + "\\ReportsExtracted\\" + name + ".pdf");

        byte[] buffer = new byte[1024];
        int bytesRead;

        while((bytesRead = is.read(buffer)) != -1){
            os.write(buffer, 0, bytesRead);
        }
        is.close();

        //flush OutputStream to write any buffered data to file
        os.flush();
        os.close();

        System.out.println(" Downloaded " + name + " report");

Надеюсь это поможет.

person Alim Azad    schedule 04.01.2019