AWS Api Gateway подключается к SQS с атрибутами сообщений - PullRequest
0 голосов
/ 18 октября 2018

Я подключил метод шлюза Api для добавления в очередь SQS, следуя этому руководству.

https://dzone.com/articles/creating-aws-service-proxy-for-amazon-sqs

Все это прекрасно работает, но я хотел бы добавить некоторые атрибуты сообщения вмои сообщения используют некоторые параметры пути, но я не могу заставить его работать.

Это текущий шаблон сопоставления из учебника.

Action=SendMessage&MessageBody=$util.urlEncode($util.escapeJavaScript($input.json('$')))

Я пытался сохранить 'application /x-www-form-urlencoded 'и добавьте к нему атрибуты MessageAttributes, изменив его на (используя статическое значение на данный момент)

    Action=SendMessage&MessageBody=$util.urlEncode($util.escapeJavaScript($input.json('$')))
&MessageAttribute[0][Name]=foo&MessageAttribute[0][Type]=String&MessageAttribute[0][Value]=bar

, но я получаю эту ошибку обратно

{
  "Error": {
    "Code": "MalformedQueryString",
    "Message": "Keys may not contain [",
    "Type": "Sender"
  },
  "RequestId": "ea121e6e-ca37-5d14-b92b-4a2c6fedf403"
}

Как я должен кодировать массив MessageAttribues без использования '['

1 Ответ

0 голосов
/ 19 октября 2018

Справочник по SQS API не дает полной ясности и, на самом деле, кажется несколько несовместимым с тем, что сервис действительно ожидает увидеть.В сети используется нотация .member.N., и N основывается на 1, а не на 0.Кроме того, MessageAttributes во множественном числе.

Ожидаемый формат выглядит следующим образом:

&MessageAttributes.member.1.Name=source_ip##
&MessageAttributes.member.1.Value.DataType=String##
&MessageAttributes.member.1.Value.StringValue=$util.urlEncode($context.identity.sourceIp)##
&MessageAttributes.member.2.Name=user_agent##
&MessageAttributes.member.2.Value.DataType=String##
&MessageAttributes.member.2.Value.StringValue=$util.urlEncode($context.identity.userAgent)##
&MessageAttributes.member.3.Name=stage##
&MessageAttributes.member.3.Value.DataType=String##
&MessageAttributes.member.3.Value.StringValue=$util.urlEncode($context.stage)##

## для удобства чтения.Вы не можете иметь новые строки в шаблоне отображения при создании веб-формы, потому что они окажутся в самой форме, а ## говорит VTL, что все, что находится здесь, до конца строки, следует игнорировать,включая перевод строки в конце строки.В противном случае встроенные символы новой строки могут привести к неправильной конструкции формы.

Также обратите внимание, что API не позволяет указывать эти значения пустыми, поэтому, если есть вероятность, что какой-либо атрибут не будет присутствовать, вам потребуется дополнительная логика, чтобы проверить это и заменить атрибут чем-тоиначе, потому что индексные номера (iirc) должны быть последовательными.

Почему мы используем шаблон отображения тела для создания веб-формы для API Gateway + SQS и дополнительную информацию о том, как его настроить, такжеболее подробно объяснил в моем ответе на Можно ли POST к URL SQS, используя тело POST?

...