J'ai créé une fonction lambda en utilisant sans serveur . Cette fonction est déclenchée via API Gateway sur une demande GET et doit renvoyer un fichier pdf à partir d'un tampon. J'utilise html-pdf pour créer le tampon et j'essaye de retourner le fichier pdf avec la commande suivante
let response = {
statusCode: 200,
headers: {'Content-type' : 'application/pdf'},
body: buffer.toString('base64'),
isBase64Encoded : true,
};
return callback(null, response);
mais le navigateur ne parvient tout simplement pas à charger le pdf, donc je ne sais pas exactement comment retourner le fichier pdf directement au navigateur. Impossible de trouver une solution à cela.
eh bien, j'ai trouvé la réponse. Les paramètres de mon objet de réponse sont corrects, je devais juste modifier manuellement les paramètres dans API Gateway pour que cela fonctionne dans le navigateur. J'ai ajouté "*/*" aux types de supports binaires sous les paramètres binaires dans la console API Gateway
API GATEWAY
L'EXTRÉMITÉ AVANT
ouvrir l'url de l'API dans un nouvel onglet (target = "_ blank"). Le navigateur gère probablement la réponse codée en base 64. Dans mon cas avec Chrome, le navigateur ouvre simplement le pdf dans un nouvel onglet exactement comme je le veux.
Après avoir passé plusieurs heures sur ce sujet, j'ai découvert que si vous définissez Content handling
Sur Convert to binary
(CONVERT_TO_BINARY), la réponse entière doit être en base64, sinon j'obtiendrais une erreur: Unable to base64 decode the body
.
Par conséquent, ma réponse ressemble maintenant à:
callback(null, buffer.toString('base64'));
La réponse d'intégration:
La réponse de la méthode:
Et les types de supports binaires:
Si vous avez un gigantesque PDF, alors Lambda mettra longtemps à le renvoyer et dans Lambda, vous êtes facturé aux 100 ms.
Je l'enregistrerais d'abord sur S3, puis je laisserais la Lambda renvoyer l'URL S3 au client pour téléchargement.
La solution ci-dessus est uniquement pour un type de contenu particulier. Vous ne pouvez plus de type de contenu. Suivez uniquement les étapes ci-dessous en deux étapes pour résoudre plusieurs problèmes de type de contenu.
Passerelle API -> API -> méthode -> demande d'intégration
Créez votre réponse en tant que
laissez réponse = {
statusCode: 200,
headers: {
'Content-type': 'application/pdf',//you can change any content type
'content-disposition': 'attachment; filename=test.pdf' // key of success
},
body: buffer.toString('base64'),
isBase64Encoded: true
};
return response;
Remarque * - Ce n'est pas sécurisé