【问题标题】:JSReport API Save PDF from Response with JavaJSReport API 使用 Java 从响应中保存 PDF
【发布时间】:2020-01-24 19:26:18
【问题描述】:

我需要保存POST服务的PDF,但总是收到错误:

“提取类型 [class java.lang.Object] 和内容类型 [application/pdf] 的响应时出错;嵌套异常是 org.springframework.http.converter.HttpMessageNotReadableException:JSON 解析错误:意外字符('%' (代码 37)):期望一个有效值(JSON 字符串、数字、数组、对象或标记“null”、“true”或“false”); 嵌套异常是 com.fasterxml.jackson.core.JsonParseException: Unexpected character ('%' (code 37)): 需要一个有效值(JSON 字符串、数字、数组、对象或标记 '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);
    }
}

【问题讨论】:

    标签: java spring rest spring-boot jsreport


    【解决方案1】:

    在这种情况下,curl 对调试非常有用。

    如果我使用您的属性、身份验证、json 有效负载和 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”good ans

    【讨论】:

    • 谢谢。为了您的及时回复。以同样的方式我找到了解决方案。
    【解决方案2】:

    我解决了。同样,非常感谢那些做出回应的人。

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

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-20
      相关资源
      最近更新 更多