Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JSReport API使用Java从响应中保存PDF_Java_Spring_Rest_Spring Boot_Jsreport - Fatal编程技术网

JSReport API使用Java从响应中保存PDF

JSReport API使用Java从响应中保存PDF,java,spring,rest,spring-boot,jsreport,Java,Spring,Rest,Spring Boot,Jsreport,我需要保存邮政服务的PDF,但我总是收到错误: “提取类型[class java.lang.Object]和内容类型[application/pdf]的响应时出错;嵌套异常为org.springframework.http.converter.httpMessageNodeAbleException:JSON解析错误:意外字符('%'(代码37)):应为有效值(JSON字符串、数字、数组、对象或标记'null'、'true'或'false'); 嵌套异常为com.fasterxml.jackso

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

“提取类型[class java.lang.Object]和内容类型[application/pdf]的响应时出错;嵌套异常为org.springframework.http.converter.httpMessageNodeAbleException:JSON解析错误:意外字符('%'(代码37)):应为有效值(JSON字符串、数字、数组、对象或标记'null'、'true'或'false'); 嵌套异常为com.fasterxml.jackson.core.JsonParseException:意外字符(“%”(代码37)):应为有效值(JSON字符串、数字、数组、对象或标记“null”、“true”或“false”)”

我正在使用SpringBoot和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);
    }
}
public静态最终字符串base\u url=”https://evx.jsreportonline.net/api/report";
静止的{
HttpsURLConnection.setDefaultHostnameVerifier((主机名,会话)->hostname.equals(“evx.jsreportonline.net”);
}
私有HttpHeaders getHeaders(){
if(null==头){
headers=新的HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
setAccept(Arrays.asList(MediaType.ALL));
headers.add(“Authorization”,“Basic”+Base64.getEncoder().encodeToString(“test\u pdf:test\u pdf.getBytes());
}
返回标题;
}
公开声明{
列表>();
MappingJackson2HttpMessageConverter=新的MappingJackson2HttpMessageConverter();
RestTemplate RestTemplate=新RestTemplate();
Json jsonObj=new Json(“{\”模板\“:{\”短ID \“:\”JCdUaT \“},\”数据\“:null}”);
//请求
HttpEntity=新的HttpEntity(jsonObj,this.getHeaders());
/*尺寸转换器*/
setSupportedMediaTypes(Collections.singletonList(MediaType.ALL));
messageConverters.add(converter);
restemplate.setMessageConverters(messageConverters);
/*回应*/
试一试{
Object result=restTemplate.postForObject(基本url、实体、Object.class);
字节[]结果字节=(字节[])结果;
}捕获(例外e){
System.out.println(e.getMessage()+“”+e);
}
}

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

如果我使用您的属性、auth、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.
HTTP/2200 日期:2020年1月24日星期五19:45:07 GMT 内容类型:application/pdf 服务器:nginx/1.17.6 x-powered-by:Express 访问控制允许来源:* 访问控制公开标头:* 设置cookie:render complete=true;路径=/ 设置cookie: 内容配置:内联;filename=invoice-main.pdf 工作学分:1.12 警告:二进制输出可能会弄乱终端。使用“-output-”来说明 警告:卷曲输出到你的终端,或考虑“-输出” 警告:“保存到文件。
这告诉我,我得到了二进制数据作为响应。在这种情况下,我需要使用不同的转换器。试试这里显示的“ByteArrayHttpMessageConverter”

我解决了它。同样,非常感谢那些作出答复的人

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


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

}

public void getRepo(){
Json reporte=newJSON(“{\”模板\“:{\”短ID \“:\”ytyg1Ho \“},\”数据\“:空}”);
列表>();
MappingJackson2HttpMessageConverter=新的MappingJackson2HttpMessageConverter();
/*尺寸转换器*/
添加(新的bytearrayhtpmessageconverter());
setSupportedMediaTypes(Collections.singletonList(MediaType.ALL));
messageConverters.add(converter);
RestTemplate RestTemplate=新的RestTemplate(messageConverters);
//请求
HttpEntity=新的HttpEntity(reporte,this.getHeaders());
/*回应*/
试一试{
byte[]response=restemplate.postForObject(基本url,实体,byte[].class);
System.out.println(“响应”+新字符串(响应));
}捕获(例外e){
System.out.println(e.getMessage()+“”+e);
}

}

谢谢。谢谢你的及时回复。以同样的方式,我找到了解决办法。
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);
}