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
这工作得很好,但是是否可以使用帖子主体发送有效载荷?
我有一个外部服务在post body中发送json有效负载(以非常高的吞吐量)。如果我可以简单地直接向他们提供SQS url,并且避免创建一个AWSapi网关,那将是理想的
我对替代解决方案持开放态度。
这可能不是API网关的设计者所想的,但是考虑到…
>
AWSQuery API(由SDK使用)在线上为SQS等服务工作的方式--标准application/x-www-form-urlencoded
格式的url编码键/值对,以及
API网关(VTL)中的内置主体映射模板语言公开了$util. urlEncode()
,并且
API网关在将请求发送到后端服务时可以透明地对请求进行签名
…这意味着您可以简单地手动构造一个有效的API请求——表单发布——就像使用VTL模板一样,它封装了原始消息体——urlencoded,这就是我们所需要的。我们实际上并不关心它是JSON,只要它是有效的字符数据。
使用此解决方案,可以避免Lambda函数,并且客户端不需要了解SQS期望消息如何格式化的任何信息。
整个传入请求主体成为SQS中的Message
。
在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
在HTTPHeaders
下,添加一个标题Content-Type
。该值应指定为映射自'application/x-www-form-urlencoded'
-注意这是一个单引号字符串。
在人体映射模板
下,选择从不
。
添加application/json
的Content-Type
并使用以下映射模板:
Action=SendMessage##
&QueueUrl=$util.urlEncode('https://sqs.us-east-2.amazonaws.com/000000000000/my-queue-name')##
&MessageBody=$util.urlEncode($input.body)##
还有一个API,它将原始JSON输入体转换为SQSSendMessage
API请求。
每行末尾的##
是为了易读性--VTL是一种文本模板语言,因此保留了空格和换行符。将##
放在每行末尾会导致换行符被剥离,这对于构建正确的Web表单是必要的。否则,整个正文映射模板将需要在一行上。
部署然后测试:
$ curl -X POST https://xxxxxxxxxx.execute-api.us-east-2.amazonaws.com/v1 --data '{"works": true}' -H 'Content-Type: application/json'
回应:
{"SendMessageResponse":{"ResponseMetadata":{"RequestId":"bbbbbbbb-aaaa-5555-8888-334ed25bb6b3"},"SendMessageResult":{"MD5OfMessageAttributes":null,"MD5OfMessageBody":"81f2ecc3cb027268138bdfe7af0f8a3f","MessageId":"cccccccc-dddd-4444-1111-542e08bb39af","SequenceNumber":null}}}
为了获得额外的学分,也可以重用集成响应中的主体映射模板来自定义响应。
https://blog.rewind.io/2016/11/16/handle-shopify-webhooks-without-a-server有关于这个主题的教程