我正在尝试访问公开pdf文件的Rest服务,但是在调用该过程时我得到了这个响应:
{
"errors": [
"Failed to parse the payload from backend (procedure: HttpRequest)"
],
"info": [
],
"isSuccessful": false,
"responseHeaders": {
"Content-Type": "application\/octet-stream; type=\"application\/xop+xml\"; boundary=\"uuid:****************\"; start=\"<pdf>\"; start-info=\"application\/pdf\"",
"Date": "Thu, 07 Nov 2013 14:44:54 GMT",
"Server": "Apache-Coyote\/1.1",
"Transfer-Encoding": "chunked",
"X-Powered-By": "Servlet 2.5; **********",
"content-disposition": "attachment; filename = ********.PDF"
},
"responseTime": 5329,
"statusCode": 200,
"statusReason": "OK",
"totalTime": 9923,
"warnings": [
]
}
我可以使用worklight适配器获取pdf文件吗?还有其他办法吗?
答案 0 :(得分:3)
我能够通过从适配器调用Java例程来调用后端服务,该服务将PDF作为byte[]
返回。检索byte[]
后,base64
在Java例程中对其进行编码,URI在适配器中对其进行编码,然后在客户端js代码中执行相反的操作。 Java代码使用Apache HttpClient
。我尝试了普通的返回类型以及其他没有运气的类型。
适配器代码:
var service = new ServiceClient();
var pdf = service.getUnsecureContentBase64(url);
result.pdf = encodeURIComponent(pdf);
return result;
客户代码:
onSuccess : function (response){
var pdfText = decodeURIComponent(response.invocationResult.pdf);
var pdf = base64DecToArr(pdfText);
//use pdf byte[] to pass to Mozilla pdf.js
var pdfText = decodeURIComponent(response.invocationResult.pdf);
var pdf = base64DecToArr(pdfText);
PDFJS.disableWorker = false;
PDFJS.getDocument(pdf).then(function (pdfDoc) {
//use pdfDoc to render
});
}
Java代码:
public class ServiceClient {
public String getUnsecureContentBase64(String url)
throws ClientProtocolException, IOException {
byte[] result = getUnsecureContent(url);
return Base64.encodeBase64String(result);
}
public byte[] getUnsecureContent(String url)
throws ClientProtocolException, IOException {
byte[] result = null;
CloseableHttpClient httpclient = null;
try {
httpclient = HttpClientBuilder.create()
.setRedirectStrategy(new LaxRedirectStrategy()).build();
HttpGet httpget = new HttpGet(url);
// Create a response handler
ResponseHandler<byte[]> handler = new ResponseHandler<byte[]>() {
public byte[] handleResponse(HttpResponse response)
throws ClientProtocolException, IOException {
HttpEntity entity = response.getEntity();
if (entity != null) {
return EntityUtils.toByteArray(entity);
} else {
return null;
}
}
};
result = httpclient.execute(httpget, handler);
} finally {
if (httpclient != null) {
httpclient.close();
}
}
return result;
}
}
答案 1 :(得分:1)
您需要更改适配器实现中的'returnedContentType'参数。我的猜测是你现在把它设置为'xml'。由于从后端检索的pdf不是XML格式,因此您收到该错误消息。
示例:
function getPDF() {
var input = {
method : 'get',
returnedContentType : 'plain',
path : "/test.pdf"
};
return WL.Server.invokeHttp(input);
}