Как разместить файл JSON как MessageBody для Amazon SQS?

Я запускаю ElasticMQ локально для эмуляции Amazon SQS, и я хочу отправить файл JSON в виде MessageBody. Вот пример запроса, который работает:

$ curl 'http://localhost:9324/queue/foo?Action=SendMessage&MessageBody={"action":"hey"}'

<SendMessageResponse xmlns="http://queue.amazonaws.com/doc/2012-11-05/">
          <SendMessageResult>
              [...]

Если я хочу отправить большой JSON-файл, это будет более логично, если это будет POST, что-то вроде этого:

$ curl 'http://localhost:9324/queue/foo?Action=SendMessage' -X POST \
     -H "Content-Type: application/json" --data @./bigdata.json

There was an internal server error.

Есть ли способ сделать эту работу?

3 ответа

Сейчас это старый, но недавно мне не хватило этого, и я хотел добавить то, что нашел.

Если вы установите Content-Type к text/plain сообщение проходит успешно, что интуитивно противоречит полезной нагрузке данных json.

$ curl -X "POST" "https://sqs.us-east-1.amazonaws.com/136525823465/rfidsqs?Action=SendMessage" -H 'Content-Type: text/plain' -d '{"testKey1": 123456,"testKey2": "5sUXJYodEUVvQwVT"}'

Ответ

<SendMessageResponse xmlns="http://queue.amazonaws.com/doc/2012-11-05/">
  <SendMessageResult>
    <MessageId>ba2f6498-0e6b-48cd-bd8f-027d911082b6</MessageId>
    <MD5OfMessageBody>4c8132a52a4e6f0bb5ecbe758502c69f</MD5OfMessageBody>
  </SendMessageResult>
  <ResponseMetadata>
    <RequestId>ddc02593-8757-5d0b-a780-72183ae5f517</RequestId>
  </ResponseMetadata>
</SendMessageResponse>

Я не думаю, что это возможно. Основываясь на документации и экспериментах, он принимает только один тип контента: application/x-www-form-urlencoded это означает, что тело может иметь только key=value пар. Вы могли бы предоставить значение, которое было фактическим телом JSON

cbongiorno at wa-christianb-mbp in ~/dev/core-infra on anchore-update [+!$]
$  curl -H "content-type: application/json" -d '{"id":123}' https://sqs.us-east-1.amazonaws.com/123456789/christian-anchore-test?Action=SendMessage | xmllint --format -
<?xml version="1.0"?>
<ErrorResponse xmlns="http://queue.amazonaws.com/doc/2012-11-05/">
  <Error>
    <Type>Sender</Type>
    <Code>MissingParameter</Code>
    <Message>The request must contain the parameter MessageBody.</Message>
    <Detail/>
  </Error>
  <RequestId>9452510a-0a40-5f68-8319-05cf9ed70beb</RequestId>
</ErrorResponse>

Это кажется отвратительно близоруким решением, но, как вы можете судить по принятым параметрам, есть только 1 URL, и он используется в качестве URL контрольного сигнала. Это очень похоже на SOAP, но в некотором роде.

У меня сейчас такая же борьба. В зависимости от того, что вы пытаетесь сделать, вы можете создать частный API-шлюз и подключить лямбду, чтобы переназначить его. Но независимо от того, как вы нарезаете его, вы ДОЛЖНЫ переназначить его

это работает для меня

      aws  --endpoint-url http://localhost:9324 sqs send-message --queue-url http://localhost:9324/000000000000/<your queue>  --message-body "`cat ./<yourjsonfile.json>`"
Другие вопросы по тегам