与 API 网关相比,AWS Lambda 函数 URL returns 不同的 content-length 值
AWS Lambda function URL returns a different content-length value compared to API Gateway
我有一个加载 S3 文件的 lambda,returns 它作为 Base64:
return {
"isBase64Encoded": True,
'statusCode': 200,
'body': b64encode(...).decode('utf-8'),
'headers': {
'Content-Type': 'application/octet-stream',
}
}
我创建了一个 API 网关,当我调用它时,我得到:
<Response [200]>
Content-Type application/octet-stream
Content-Length 998356
apparent_encoding ascii
但是调用函数URL returns:
<Response [200]>
Content-Type application/octet-stream
Content-Length 748765
apparent_encoding None
正确的 content-length
header 值是 API 网关返回的值,但是 header 在使用函数 URL 时是不同的,即使它们都链接到相同的 Lambda 函数版本并调用完全相同的代码。
问题是什么?
当isBase64Encoded
设置为true
时,Lambda函数正在反编码获取原始数据。这就是您获得较低 content-length
值的原因。
但是,b64encode(...).decode('utf-8')
会对您的 body
内容进行编码,然后将其解码回非 base64 编码的内容。你实际上并没有返回 base64 编码的数据,但你指定你是。
将 isBase64Encoded
设置为 false
,您应该会收到正确的全部数据 - 至于为什么它与 API 网关一起工作,它可能会进行内部检查,意识到您实际上并没有返回 base-64 编码的数据和 returns 原样的数据。
我有一个加载 S3 文件的 lambda,returns 它作为 Base64:
return {
"isBase64Encoded": True,
'statusCode': 200,
'body': b64encode(...).decode('utf-8'),
'headers': {
'Content-Type': 'application/octet-stream',
}
}
我创建了一个 API 网关,当我调用它时,我得到:
<Response [200]>
Content-Type application/octet-stream
Content-Length 998356
apparent_encoding ascii
但是调用函数URL returns:
<Response [200]>
Content-Type application/octet-stream
Content-Length 748765
apparent_encoding None
正确的 content-length
header 值是 API 网关返回的值,但是 header 在使用函数 URL 时是不同的,即使它们都链接到相同的 Lambda 函数版本并调用完全相同的代码。
问题是什么?
当isBase64Encoded
设置为true
时,Lambda函数正在反编码获取原始数据。这就是您获得较低 content-length
值的原因。
但是,b64encode(...).decode('utf-8')
会对您的 body
内容进行编码,然后将其解码回非 base64 编码的内容。你实际上并没有返回 base64 编码的数据,但你指定你是。
将 isBase64Encoded
设置为 false
,您应该会收到正确的全部数据 - 至于为什么它与 API 网关一起工作,它可能会进行内部检查,意识到您实际上并没有返回 base-64 编码的数据和 returns 原样的数据。