JSReport API使用Java从响应中保存PDF
我需要保存邮政服务的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 例如: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
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);
}