Как разместить файл 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>`"