我如何 POST 一个 JSON 文件作为 Amazon SQS 的 MessageBody?
How do I POST a JSON file as MessageBody for 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.
有没有办法让它工作?
我认为这不可能。根据文档和实验,它接受的唯一内容类型是 application/x-www-form-urlencoded
形式,这意味着正文可以 仅 有 key=value
对。您可能必须提供一个实际值 JSON body
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,但以一种 custom/hacked 废话的方式。
我现在也有同样的挣扎。根据您要执行的操作,您可以创建一个私有 API 网关并连接一个 lambda 以重新映射它。但无论你如何切片,你都必须重新映射它
这是一个旧的,但我最近在这方面做得不够,想添加我发现的内容。
如果您将 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>
这对我有用
aws --endpoint-url http://localhost:9324 sqs send-message --queue-url http://localhost:9324/000000000000/<your queue> --message-body "`cat ./<yourjsonfile.json>`"
我 运行 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.
有没有办法让它工作?
我认为这不可能。根据文档和实验,它接受的唯一内容类型是 application/x-www-form-urlencoded
形式,这意味着正文可以 仅 有 key=value
对。您可能必须提供一个实际值 JSON body
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,但以一种 custom/hacked 废话的方式。
我现在也有同样的挣扎。根据您要执行的操作,您可以创建一个私有 API 网关并连接一个 lambda 以重新映射它。但无论你如何切片,你都必须重新映射它
这是一个旧的,但我最近在这方面做得不够,想添加我发现的内容。
如果您将 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>
这对我有用
aws --endpoint-url http://localhost:9324 sqs send-message --queue-url http://localhost:9324/000000000000/<your queue> --message-body "`cat ./<yourjsonfile.json>`"