And*_*Wei 6 amazon-web-services aws-lambda
https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html
https://sqs.us-east-2.amazonaws.com/123456789012/MyQueue/
?Action=SendMessage
&MessageBody=This+is+a+test+message
Run Code Online (Sandbox Code Playgroud)
这工作正常,但是可以使用帖子体发送有效载荷吗?
我有一个外部服务在post体中发送json有效负载(吞吐量非常高).如果我可以直接向他们提供SQS网址,并且避免必须创建AWS api网关 - > lambda - > SQS堆栈,那将是理想的选择.
我愿意接受其他解决方案.
Mic*_*bot 10
这可能不是确切什么API网关的设计者的初衷,但鉴于方式AWS查询API的(如使用的软件开发工具包)上线的工作-在一个urlencoded的形式键/值对-和事实API网关(VTL)中的内置正文映射模板语言公开$util.urlEncode()...这意味着你可以简单地使用VTL模板手工构建一个API请求 - 一个表单post - 封装原始消息体 - - urlencoded,这就是我们所需要的.我们实际上并不关心它是JSON,只要它是有效的字符数据.
使用此解决方案,可以避免使用Lambda函数,并且客户端无需了解SQS如何格式化消息.
整个传入请求正文成为MessageSQS.
在API网关控制台中:
创建资源(例如/)和方法(例如POST).
在"集成请求"设置中:
Integration type: AWS Service
AWS Region: [select your region]
AWS Service: Simple Queue Service (SQS)
AWS Subdomain [leave blank]
HTTP Method: POST
Action Type: Use path override
Path override: /
Execution Role: [your role ARN, needs to be able to send a message to the queue]
Credentials cache: Do not add caller credentials to cache key
Content Handling: Passthrough
Run Code Online (Sandbox Code Playgroud)
在HTTP Headers,添加一个标题,Content-Type.该值应指定为"映射自" 'application/x-www-form-urlencoded'- 请注意,这是一个单引号字符串.
在Body Mapping Templates,选择Never.
添加Content-Type的application/json,并使用以下映射模板:
Action=SendMessage##
&QueueUrl=$util.urlEncode('https://sqs.us-east-2.amazonaws.com/000000000000/my-queue-name')##
&MessageBody=$util.urlEncode($input.body)##
Run Code Online (Sandbox Code Playgroud)
并且您有一个API可以将原始JSON输入主体转换为SQS SendMessageAPI请求.
在##每行的结尾是可读性- VTL是一个文本模板语言,所以空格和换行被保留.放置##在每一行的末尾会导致换行被剥离,这对于构建正确的Web表单是必要的.否则,整个身体映射模板将需要在一行上.
部署然后测试:
$ curl -X POST https://xxxxxxxxxx.execute-api.us-east-2.amazonaws.com/v1 --data '{"works": true}' -H 'Content-Type: application/json'
Run Code Online (Sandbox Code Playgroud)
响应:
{"SendMessageResponse":{"ResponseMetadata":{"RequestId":"bbbbbbbb-aaaa-5555-8888-334ed25bb6b3"},"SendMessageResult":{"MD5OfMessageAttributes":null,"MD5OfMessageBody":"81f2ecc3cb027268138bdfe7af0f8a3f","MessageId":"cccccccc-dddd-4444-1111-542e08bb39af","SequenceNumber":null}}}
Run Code Online (Sandbox Code Playgroud)
为了获得额外的功劳,还可以重用Integration Response中的正文映射模板来自定义响应.
| 归档时间: |
|
| 查看次数: |
3684 次 |
| 最近记录: |