提问者:小点点

是否可以使用帖子主体发布到SQS网址


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网关,那将是理想的

我对替代解决方案持开放态度。


共2个答案

匿名用户

这可能不是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/jsonContent-Type并使用以下映射模板:

    Action=SendMessage##
    &QueueUrl=$util.urlEncode('https://sqs.us-east-2.amazonaws.com/000000000000/my-queue-name')##
    &MessageBody=$util.urlEncode($input.body)##
    

    还有一个API,它将原始JSON输入体转换为SQSSendMessageAPI请求。

    每行末尾的##是为了易读性--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有关于这个主题的教程