AWS-API-Gateway und Lambda-Rückkehr-Bild
Sagen, dass ich diese HTML:
<img src="http://example.com/pic"/>
Was ich möchte zu tun ist example.com/pic die Zuordnung zu einer AWS-API-Gateway-Endpunkt.
Diesem Endpunkt würde dann eine lambda-Funktion.
Dass die lambda-Funktion Lesen würden, ein zufälliges Bild aus einem s3-bucket und gibt es zurück.
Also mein Ziel ist es, eine STANDARD-HTML-image-tag und enden mit einem Bild aus einem s3-bucket aber werde über manche Entscheidung-code im lambda-Ausdruck, um zu entscheiden, das Bild, um zurückzukehren.
Ich weiß, Sie können verwenden, s3 dienen die statischen Inhalte direkt (daher der lambda-Ausdruck, um die Entscheidung über das, was Bild). Ich weiß auch, ich könnte Dinge zu tun die in der lambda-wie b64 Kodieren Sie die Antwort und dann Griff er auf dem client, aber ich bin darauf abzielt, verwenden Sie die standard-HTML-IMG-tag.
Ist das möglich?
Ich habe versucht, mit der ResponseStreamHandler (Java SDK) für die lambda-und die Rückkehr auf das byte-array des Bildes und auch die API-gateway-config nicht anzeigen der Ausgabe in JSON, aber nichts scheint zu funktionieren!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Scheint es, hat AWS vereinfacht diesen Prozess, so dass viele Antworten sind veraltet und/oder zu kompliziert.
Dies ist, wie ich die Lambda um sich wieder ein Bild über die API-Gateway, ab Juni 2018:
1) In der API-Gateway aktivieren
Use Lambda Proxy integration
für Ihre API. (Diese Einstellung befindet sich auf der Integration der Anfrage-Bereich, wo Sie gesetzt hatte der Typ Lambda.)2) In der API-Gateway, wählen Sie Ihre API und klicken Sie auf
Settings
. InBinary Media Types
hinzufügen*/*
. (Hinweis: ich habe versucht, hinzufügen einfach 'image/jpeg', aber es zu verlangen scheint*/*
alle diese arbeiten)3) sicher Sein, dass Sie zur Implementierung der API, sonst werden die änderungen nicht live. (In API-Gateway, wählen Sie Ihre API, dann Aktionen > Bereitstellen von API).
4) Im Lambda-code, geben Sie Ihr Bild in Base64-Codierung (in diesem Beispiel wird C# - code):
Getan.
Wenn Sie schon Ihre setup-API keine Authentifizierung erforderlich ist, geben Sie einfach Ihren API-link in Ihren browser ein, und es wird das Bild angezeigt. Oder setzen Sie den API-link in eine
IMG
tag. z.B.<img src="https://asdf.execute-api.us-east-1.amazonaws.com/live/myapi" />
Hinweis: Auch wenn die im Schritt 2 legen Sie die
Binary Media Types
zu*/*
, API-Gateway wird noch den text wieder, wenn das ist, was deine Lambda ist die Rückkehr.*/*
ist, weil APIG dummerweise erfordert den accept-header übereinstimmen. Damit der client von muß sendenAccept: image/jpeg
um für die binäre Decodierung auftreten. Seit chrome (alle Browser?) sendenAccept: */*
macht, dass es funktioniert.*/*
und die info, dass Sie zum bereitstellen der api jedes mal, wenn du etwas ändern!Accept : */*
war nützlich als browser sendet*/*
und ich wurde wieder bestimmter Inhaltstyp"Content-Type": "image/jpeg"
isBase64Encoded
alstrue
im response-Objekt. Das funktioniert der trick für die Rückkehr von binären Daten.Zum Glück, jetzt AWS-API-Gateway unterstützt binäre Daten, allerdings müssen Sie auch aktualisieren Sie Ihre Ressource-Methode über die Konsole, da es noch nicht implementiert ist in der Konsole. Dies ist, was Sie tun müssen:
Set
Content-Type
alsimage/jpeg
im HTTP-200-Status-AntwortHeader
Set
Content-Type
als'image/jpeg'
im Header-Zuordnungen. Geist die Anführungszeichen!contentHandling
AttributCONVERT_TO_BINARY
auf Ihre Integration AntwortÜberprüfen, um gesamten Prozess in diesem tollen step-by-step-guide: https://stackoverflow.com/a/41434295/720665
Ich habe in einem ähnlichen problem. Wie erwähnt, können derzeit nicht direkt zurück Ihr image in binary format aus Ihrer API-Gateway-Endpunkt, die erforderlich sein würde für den browser richtig anzeigen.
Allerdings habe ich dies Problem gelöst, indem statt mit API-Gateway zurückgeben 302 Redirect, die auf die richtige Datei im S3. Sie können Ihre Lambda-Funktion die url der Datei ein, die später zugeordnet Location-header in der API-Gateway. Der browser folgt der Umleitung und zeigt das Bild korrekt.
Gibt es mehrere Wege zur Umsetzung der redirect, aber ich habe Sie wie folgt vor:
Lambda gibt ein Objekt zurück, mit dem Ziel, Bild, etwa so:
Entfernen Sie die normale '200' Methode Response-Status aus Der Integration der Reaktion in der API-Gateway. Ersetzen Sie es mit einem '302' response-status und fügen Sie die 'Location' - header zugeordnet zu Wert " - integration.Antwort.Körper.Lage'
Fügen Sie den 302 status der Methode Response sowie
Nur klar zu sein, hat der Kunde zwei unterschiedliche Anforderungen:
In anderen Worten, die Bilddaten werden nicht inline in das HTML-Format.
Basierend auf diesem wissen können Sie einen Lambda-Ausdruck (hinter der API-gateway), wie Sie vorschlagen. Die Lambda-Implementierung kann etwas Logik bestimmt, dass die url zum Bild gespeichert in S3. Aber die Lambda gibt JSON-Daten und nicht das HTML-Format (es gibt Möglichkeiten, wie Rückgabe des html-Codes in eine variable) das macht die Dinge komplizierter, vor allem bei großen HTML-Seiten.
Schlage ich vor, einen etwas anderen Ansatz, da nur Empfang ein image-tag kommt man nicht weit. Ich nehme an, Sie werden inline-image-tag in einem HTML-Dokument, wahrscheinlich durch die Verwendung von JavaScript. Dann könnte man genauso gut lassen Sie das API-Gateway - /Lambda-request Rückgabe eines JSON-Dokument mit der Bild-url und lassen Sie das JavaScript entweder aktualisieren Sie eine vorhandene image-tag mit der neuen url oder generieren ein tag für Sie.
Es derzeit nicht möglich, weil Sie nicht zurückkehren können binäre Daten durch die AWS-API-Gateway.
Für diese Arbeit, die lambda-Funktion würde zurückkehren müssen die Bild-Daten als Binär-blob, und einige meta-Informationen wie die Bild-Inhalte geben. Dann, AWS-API-Gateway müsste in der Lage sein, um diese Karte zu der HTTP-Antwort. Zum Beispiel:-
lambda gibt:
{
contentType: 'image/png',
image: "encoded binary data"
}
dann API-gateway benötigen würde, um anzeigen contentType auf den 'content-type' - header der Antwort, und legen Sie die Bild-Daten im body der Antwort mit der richtigen Codierung und Länge.
Leider, es nicht tut, dieses Recht jetzt. Es werden nur maps von text-encodings wie application/json oder application/xml als Antwort geben (es ist konzipiert für APIs, nachdem alle).
Könnte man sehr leicht erreichen, dies mit ElasticBeanstalk, wo Sie eine Menge mehr Kontrolle über den http-Antwort.