Question

J'essaie d'accéder à un service de repos qui expose un fichier PDF, mais j'obtiens cette réponse lors de l'invoquer la procédure:

{
   "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": [
   ]
}

Puis-je obtenir un fichier PDF à l'aide d'un adaptateur Worklight? Y a-t-il une autre manière?

Était-ce utile?

La solution

J'ai pu le faire en appelant une routine Java à partir de l'adaptateur pour appeler le service back-end qui renvoie le PDF en tant que byte[]. Une fois la byte[] est récupéré je base64 Encodez-le dans la routine Java, URI le codez dans l'adaptateur, puis faites l'inverse dans le code JS client. Le code Java utilise l'Apache HttpClient. J'ai essayé le type de retour ordinaire ainsi que les autres sans chance.

Exemple java ici

Code de l'adaptateur:

var service = new ServiceClient(); 
var pdf = service.getUnsecureContentBase64(url);
result.pdf = encodeURIComponent(pdf);

return result;

Code client:

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

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

Autres conseils

Vous devez modifier le paramètre `` retournéContentType '' dans votre implémentation d'adaptateur. Je suppose que c'est maintenant que vous l'avez réglé sur «XML». Étant donné que le PDF qui est récupéré de votre backend n'est pas en XML, vous recevez ce message d'erreur.

Exemple:

function getPDF() {

    var input = {
        method : 'get',
        returnedContentType : 'plain',
        path : "/test.pdf"
    };

    return WL.Server.invokeHttp(input);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top