我已经为此苦苦挣扎了一段时间了。我需要在 API 网关中创建一个链接到 lambda 函数的资源,该函数将 pdf 文件作为作为 multipart/form-data POST 请求发送的输入。为了简单起见,我现在只是返回文件。
当我尝试使用以下curl调用API时,我得到内部服务器错误来自AWS。有没有人在不使用 S3 技巧(上传到 S3)的情况下成功将 pdf 文件发送到 Lambda 的?
预先感谢大家的任何提示。
命令/文件:
curl
curl -vvv -X POST -H "Content-Type: multipart/form-data" -F "[email protected] /cdn-cgi/l/email-protection" https://...MYAPIHERE.../pdf
我目前使用的是无服务器和 python3。
以下是我的文件:
服务器文件.yaml
function:
pdf:
handler: handler.pdf
events:
- http:
path: /pdf
method: post
integration: lambda
request:
template:
application/json: "$input.json('$')"
response:
headers:
Content-Type: "'aplication/json'"
处理程序.py
def pdf(event, context):
pdf = event.get('content')
out = {'statusCode': 200,
'isBase64Encoded': False,
'headers': {"content-type": "application/json"},
'body': json.dumps({
'input': pdf,
'inputType': 'url',
#'tags': list(tags.keys()),
'error': None})}
return(out)
经过大量谷歌搜索并在 AWS 支持团队的帮助下,我终于成功解决了这个问题。
事实证明,API网关会检查传入请求中的标头:“Content-Type”或“Accept”,并将其与以下设置进行匹配二进制媒体类型决定哪个有效负载被视为二进制。这意味着我们需要指定两种内容类型(multipart/form-data、application/pdf):二进制媒体类型.
可以使用无服务器来做到这一点无服务器-apigw-二进制 https://github.com/maciejtreder/serverless-apigw-binary并将这些添加到无服务器.yml:
plugins:
- serverless-apigw-binary
custom:
apigwBinary:
types: #list of mime-types
- 'multipart/form-data'
- 'application/pdf'
但由于 lambda 期望有效负载为应用程序/jsonAPI网关的格式,二进制数据不能直接传递。因此,ContentHandling 的设置应设置为“CONVERT_TO_TEXT”。在 yaml 文件中,这会转换为:
contentHandling: CONVERT_TO_TEXT
最后的接球由克里斯·戈尔森 (Kris Gohlson) 解决无服务器缩略图 https://github.com/krisgholson/serverless-thumbnail。谢谢你的克里斯。我只是想知道你是怎么想出这个的...
无服务器.yml
plugins:
- serverless-apigw-binary
custom:
apigwBinary:
types: #list of mime-types
- 'multipart/form-data'
- 'application/pdf'
function:
pdf:
handler: handler.pdf
events:
- http:
path: /pdf
method: post
integration: lambda
request:
contentHandling: CONVERT_TO_TEXT
passThrough: WHEN_NO_TEMPLATES
template:
application/pdf: "{'body': $input.json('$')}"
multipart/form-data: "{'body': $input.json('$')}"
response:
contentHandling: CONVERT_TO_BINARY
headers:
Content-Type: "'aplication/json'"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)