当前位置: 首页 > 知识库问答 >
问题:

通过API网关从AWS lambda返回二进制体和http头

胡鸿志
2023-03-14

我有一个lambda,它需要通过api网关(使用lambda集成)返回一个二进制对象和一些http头(例如,内容类型),或者重定向到另一个URL。在二进制支持示例中(例如。https://aws.amazon.com/blogs/compute/binary-support-for-api-integrations-with-amazon-api-gateway/)lambda只返回二进制对象(图像)的(base64)。在我的例子中,我还需要返回一个状态码和http头(或类似的东西)。我一直在努力解决如何在api网关中使用二进制支持来实现这一点。

lambda在此表单上返回一个json:

{
  "statusCode": 200,
  "headers": {
    "content-type": "image/jpeg"
  },
  "body": "/9j/4AAQS...gLDAoKCAwZK",
  "isBase64Encoded": true
}

在集成响应中,我为以下形式的图像/jpeg(etc)添加主体映射:

$input.json('$.body')

和内容类型的头映射,如下所示:

integration.response.body.headers['content-type']

我已经尝试了以上的许多变化,但结果是一致的

Execution failed due to configuration error: Unable to transform response 

如何将lambda中的json转换成可以由api网关转换为二进制的形式,并具有超文本传输协议头和所有内容?我可以从api网关获得更多的调试日志,以显示它不满意的更具体的内容吗?

是否有一种方法可以从api网关中获取更多调试日志?

共有3个答案

刁浩言
2023-03-14

几天来,我一直在努力做同样的事情,但找不到任何留档来备份,相反,我发现了这个https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-payload-encodings-workflow.html

将文本负载转换为二进制blob时,API网关假定

将二进制有效负载转换为文本字符串时,API网关始终适用

在我看来,这样的映射只有在另一种情况下才可能实现;我最后做的是返回base64编码的二进制字符串,并在头映射中硬编码内容类型和缓存控制;有关完整的实现,请参阅我的博客文章https://mesfinmoges.com/dynamic-image-resizing-using-amazon-s3-aws-lambda-mazon-api-gateway-amazon-cloudfront/

齐兴运
2023-03-14

我厌倦了用base64编码返回二进制数据,但我无法通过API网关从Lambda函数返回它。

因此,我决定重定向URL。我将方法响应更改为302,并添加了“Location”响应头。我还从集成响应中删除了响应代码200,选择302作为响应代码并映射集成。回答身体位置带有位置标题的值。我的Lambda代码以以下格式返回重定向URL的位置:

{"location":"www.google.com/"}

希望这有帮助。

章海
2023-03-14

我最近得到了这个工作后,面临类似的问题。

就我而言,我遗漏了两件事:

首先,我需要更改AWS将在“接受”标题中发送给上游的类型列表

"x-amazon-apigateway-binary-media-types" : [
  "image/jpeg"
]

其次,我需要将集成响应设置为“转换为二进制(如果需要)”:

"contentHandling": "CONVERT_TO_BINARY"

有关详细信息,请参阅此答案和示例配置。

我还发现我不够耐心。无论何时部署API,我都会立即进行检查,而不是等待几分钟等待更改传播。

 类似资料:
  • 在AWS文档之后,我尝试使用以下http请求从api网关导出api定义。知道它为什么不起作用吗?

  • 我错过了什么,为什么这看起来这么难?

  • 我使用AWS实验室的无服务器容器(https://github.com/awslabs/aws-serverless-java-container)来处理lambda入口点和返回HTML的lambda的响应。它似乎调用lambda并从lambda返回HTML。但是,API网关随后抛出一个fit处理响应。我使用API网关作为代理,而不是配置单个endpoint。

  • 我也没有在AWS文档中找到任何实质性的东西。

  • 我试图为web api控制器中的GET方法返回一个状态代码304 not modified。 我成功的唯一方法是这样的: 这里的问题是,它并不是一个例外,它只是没有被修改,所以客户端缓存是可以的。我还希望返回类型为User(正如所有web api示例使用GET显示的那样),而不是返回HttpResponseMessage或类似的内容。

  • 问题内容: 我正在尝试将HTTP POST发送到网络上的设备。不幸的是,我想将四个特定字节的数据发送到设备,但我似乎只能将字符串发送到设备。反正有使用JavaScript发送原始二进制文件吗? 这是我用来执行POST的脚本,除非我在数据字段中输入字符串,否则它目前不会运行。有任何想法吗? 问题答案: 默认情况下,jQuery序列化数据(传递的属性)-这意味着将 数字 作为“ 4244668417”