JSReport API Сохранить PDF из ответа с Java - PullRequest
0 голосов
/ 24 января 2020

Мне нужно сохранить PDF службы POST, но я всегда получаю сообщение об ошибке:

"Ошибка при извлечении ответа для типа [class java .lang.Object] и типа контента [application / pdf]; вложенным исключением является org.springframework.http.converter.HttpMessageNotReadableException: JSON ошибка синтаксического анализа: непредвиденный символ ('%' (код 37)): ожидаемое допустимое значение (JSON String, Number, Array, Object или токен 'null', 'true' или 'false'); вложенное исключение: com.faster xml .jackson.core.JsonParseException: неожиданный символ ('%' (код 37)): ожидается допустимое значение (JSON String, Number, Array, Object или token 'null', 'true' или 'false') "

Я использую Spring Boot и RestTemplate

Пример:

public static final String base_url = "https://evx.jsreportonline.net/api/report";

static {
    HttpsURLConnection.setDefaultHostnameVerifier((hostname, session) -> hostname.equals("evx.jsreportonline.net"));
}

private HttpHeaders getHeaders() {
    if (null == headers) {
        headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.setAccept(Arrays.asList(MediaType.ALL));
        headers.add("Authorization", "Basic " + Base64.getEncoder().encodeToString("test_pdf:test_pdf".getBytes()));
    }
    return headers;
}

public void getRepo() {

    List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
    MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
    RestTemplate restTemplate = new RestTemplate();
    Json jsonObj = new Json("{\"template\":{\"shortid\":\"JCdUaT_\"},\"data\":null}");

    // REQUEST
    HttpEntity<Object> entity = new HttpEntity<>(jsonObj, this.getHeaders());

    /* MENSAGE CONVERTER */
    converter.setSupportedMediaTypes(Collections.singletonList(MediaType.ALL));
    messageConverters.add(converter);
    restTemplate.setMessageConverters(messageConverters);

    /* RESPONSE */
    try {
        Object result = restTemplate.postForObject(base_url, entity, Object.class);
        byte[] resultByteArr = (byte[]) result;
    } catch (Exception e) {
        System.out.println(e.getMessage() + " " + e);
    }
}

Ответы [ 2 ]

0 голосов
/ 24 января 2020

Я решил это. Кроме того, большое спасибо тем, кто ответил.

public static final String base_url = "https://evx.jsreportonline.net/api/report";


static {
HttpsURLConnection.setDefaultHostnameVerifier((hostname, session) -> hostname.equals("evx.jsreportonline.net"));

}

private HttpHeaders getHeaders() {
if (null == headers) {
    headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
    headers.setAccept(Arrays.asList(MediaType.ALL));
    headers.add("Authorization", "Basic " + Base64.getEncoder().encodeToString("test_pdf:test_pdf".getBytes()));
}
return headers;

}

public void getRepo() {

Json reporte = new Json("{\"template\":{\"shortid\":\"ytyg1Ho\"},\"data\":null}");

List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();

/* MENSAGE CONVERTER */
messageConverters.add(new ByteArrayHttpMessageConverter());
converter.setSupportedMediaTypes(Collections.singletonList(MediaType.ALL));
messageConverters.add(converter);

RestTemplate restTemplate = new RestTemplate(messageConverters);

 // REQUEST
HttpEntity<Object> entity = new HttpEntity<>(reporte, this.getHeaders());

   /* RESPONSE */
try {
    byte[] response = restTemplate.postForObject(base_url, entity, byte[].class);
    System.out.println("Response "+new String(response));
}catch (Exception e) {
    System.out.println(e.getMessage() +" "+ e);
}

}

0 голосов
/ 24 января 2020

В таких ситуациях скручивание может быть действительно полезным для отладки.

Если я использую ваши атрибуты, auth, json payload и конечную точку API и отправляю запрос с помощью curl

curl -i --user test_pdf:test_pdf -H "Content-Type: application/json" -H "Accept: application/json" -X POST -d '{"template":{"shortid":"JCdUaT_"},"data":null}' https://evx.jsreportonline.net/api/report

, я получаю следующий ответ

HTTP/2 200 
date: Fri, 24 Jan 2020 19:45:07 GMT
content-type: application/pdf
server: nginx/1.17.6
x-powered-by: Express
access-control-allow-origin: *
access-control-expose-headers: *
set-cookie: render-complete=true; Path=/
set-cookie:  
content-disposition: inline;filename=invoice-main.pdf
jo-credits-spent: 1.12

Warning: Binary output can mess up your terminal. Use "--output -" to tell 
Warning: curl to output it to your terminal anyway, or consider "--output 
Warning: <FILE>" to save to a file.

Это говорит мне, что я получаю двоичные данные в ответ. В этом случае мне нужно будет использовать другой конвертер. Попробуйте 'ByteArrayHttpMessageConverter', как показано здесь хороший ответ

...