Oz1*_*123 7 linux curl rabbitmq
我正在尝试使用 rabbitmq 的 HTTP API 从队列中获取一些消息。
我正在关注这里的文档,
我没有vhost配置。
我尝试了以下 curl 命令:
curl -i -u guest:guest -H "content-type:application/json" -X POST http://127.0.0.1:15672/api/queues/foo/get -d'{"count":5,"requeue":true,"encoding":"auto","truncate":50000}'
Run Code Online (Sandbox Code Playgroud)
RabbitMQ 然后回答:
HTTP/1.1 405 Method Not Allowed
vary: origin
Server: MochiWeb/1.1 WebMachine/1.10.0 (never breaks eye contact)
Date: Thu, 20 Apr 2017 08:03:28 GMT
Content-Length: 66
Allow: HEAD, GET, PUT, DELETE, OPTIONS
{"error":"Method Not Allowed","reason":"\"Method Not Allowed\"\n"}
Run Code Online (Sandbox Code Playgroud)
你能指出我的错误吗?我怎样才能收到这些消息?
您缺少队列名称:
curl -i -u guest:guest -H "content-type:application/json" -X POST http://127.0.0.1:15672/api/queues/foo/my_queue/get -d'{"count":5,"requeue":true,"encoding":"auto","truncate":50000}'
Run Code Online (Sandbox Code Playgroud)
其中foo是虚拟主机,my_queue是队列名称。
结果:
[
{
"payload_bytes":4,
"redelivered":true,
"exchange":"",
"routing_key":"my_queue",
"message_count":5,
"properties":{
"delivery_mode":1,
"headers":{
}
},
"payload":"test",
"payload_encoding":"string"
},
{
"payload_bytes":4,
"redelivered":true,
"exchange":"",
"routing_key":"my_queue",
"message_count":4,
"properties":{
"delivery_mode":1,
"headers":{
}
},
"payload":"test",
"payload_encoding":"string"
},
{
"payload_bytes":4,
"redelivered":true,
"exchange":"",
"routing_key":"my_queue",
"message_count":3,
"properties":{
"delivery_mode":1,
"headers":{
}
},
"payload":"test",
"payload_encoding":"string"
},
{
"payload_bytes":4,
"redelivered":true,
"exchange":"",
"routing_key":"my_queue",
"message_count":2,
"properties":{
"delivery_mode":1,
"headers":{
}
},
"payload":"test",
"payload_encoding":"string"
},
{
"payload_bytes":4,
"redelivered":true,
"exchange":"",
"routing_key":"my_queue",
"message_count":1,
"properties":{
"delivery_mode":1,
"headers":{
}
},
"payload":"test",
"payload_encoding":"string"
}
]
Run Code Online (Sandbox Code Playgroud)
编辑
如果您使用的是默认虚拟主机:
curl -i -u guest:guest -H "content-type:application/json" -X POST http://127.0.0.1:15672/api/queues/%2f/my_queue/get -d'{"count":5,"requeue":true,"encoding":"auto","truncate":50000}'
Run Code Online (Sandbox Code Playgroud)
我设法解决了这个问题。钥匙:
我没有配置虚拟主机。
RabbitMQ 使用“/”符号表示默认 VHOST。
“/”在 HTTP 中被翻译成%2F...
所以正确的调用是:
curl -u guest:guest -i -H "content-type:application/json" -X POST http://127.0.0.1:15672/api/queues/%2F/foo/get -d'{"count":5,"requeue":true,"encoding":"auto","truncate":50000}'
Run Code Online (Sandbox Code Playgroud)
请注意,在最近的版本中语法似乎发生了变化(并且 HTTP API 文档似乎滞后了)并且需要设置选项而不是requeue选项ack_mode,例如"ack_mode"="ack_requeue_true"
因此,当前 RabbitMQ 版本的上述示例将是:
curl -u guest:guest -i -H "content-type:application/json" -X POST http://127.0.0.1:15672/api/queues/%2F/foo/get -d'{"count":5,"ack_mode"="ack_requeue_true","encoding":"auto","truncate":50000}'
Run Code Online (Sandbox Code Playgroud)