從API閘道中的 Lambda 代理整合傳回二進位媒體 - Amazon API Gateway

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

從API閘道中的 Lambda 代理整合傳回二進位媒體

要從 AWS Lambda 代理整合傳回二進位媒體,您需要對 Lambda 函數的回應進行 base64 編碼。您還必須配置API二進制媒體類型。承載大小上限為 10 MB。

注意

若要使用網頁瀏覽器來叫API用此範例整合,請將您API的二進位媒體類型設定為*/*。APIGateway 使用客戶端的第一個Accept標頭來確定響應是否應該返回二進制媒體。若要在無法控制Accept標頭值的順序時傳回二進位媒體 (例如來自瀏覽器的要求),請將您API的二進位媒體類型設定為 */* (針對所有內容類型)。

下列範例 Lambda 函數可將二進位映像從 Amazon S3 或文字傳回給用戶端。該函數的回應會包括一個 Content-Type 標頭,以指示給用戶端它傳回的資料類型。該函數會有條件地在其回應中設定 isBase64Encoded 屬性,具體取決於它傳回的資料類型。

Node.js
import { S3Client, GetObjectCommand } from "@aws-sdk/client-s3" const client = new S3Client({region: 'us-east-2'}); export const handler = async (event) => { var randomint = function(max) { return Math.floor(Math.random() * max); } var number = randomint(2); if (number == 1){ const input = { "Bucket" : "bucket-name", "Key" : "image.png" } try { const command = new GetObjectCommand(input) const response = await client.send(command); var str = await response.Body.transformToByteArray(); } catch (err) { console.error(err); } const base64body = Buffer.from(str).toString('base64'); return { 'headers': { "Content-Type": "image/png" }, 'statusCode': 200, 'body': base64body, 'isBase64Encoded': true } } else { return { 'headers': { "Content-Type": "text/html" }, 'statusCode': 200, 'body': "<h1>This is text</h1>", } } }
Python
import base64 import boto3 import json import random s3 = boto3.client('s3') def lambda_handler(event, context): number = random.randint(0,1) if number == 1: response = s3.get_object( Bucket='bucket-name', Key='image.png', ) image = response['Body'].read() return { 'headers': { "Content-Type": "image/png" }, 'statusCode': 200, 'body': base64.b64encode(image).decode('utf-8'), 'isBase64Encoded': True } else: return { 'headers': { "Content-type": "text/html" }, 'statusCode': 200, 'body': "<h1>This is text</h1>", }

若要進一步了解二進位媒體類型,請參閱API閘道RESTAPIs中的二進位媒體類型