已阅读文档(https://cdn.rawgit.com/rabbitmq/rabbitmq-management/v3.7.9/priv/www/api/index.html)
并且没有找到使用 HTTP API 将消息发布到 queue(不是交换器,而是队列)的方法?
这可能吗?
尽管它在生产思维中可能没有多大意义,但它对于测试目的仍然很有用。
我基本上想模仿 RabbitMQ 管理控制台中提供的“发布消息”界面。
这有可能吗?
RabbitMQ 仅支持发布到交易所。这是产品的核心功能。然后,RabbitMQ 使用绑定来确定哪些队列应该接收消息。
您可以在此处阅读这些概念。
当您在管理控制台中使用“发布消息”时,它使用默认绑定和默认交换。来自本文档:
在本教程的前面部分中,我们对交换一无所知,但仍然能够向队列发送消息。这是可能的,因为我们使用的是默认交换,我们通过空字符串(“”)来标识它。
回想一下我们之前是如何发布消息的:
channel.basic_publish(exchange='',
routing_key='hello',
body=message)
交换参数是交换的名称。空字符串表示默认或无名交换:消息将路由到具有由routing_key指定的名称的队列(如果存在)。
因此,为了出现直接发布到队列,管理界面使用队列名称作为路由键将消息发布到默认交换器(名为
amq.default
或空字符串""
)。您可以通过在浏览器中启用开发人员工具并在将消息发布到队列时观看对 /api/exchanges/vhost/name/publish
进行的 HTTP 调用来亲自查看这一点。
在您的情况下,请求将如下所示(使用 Chrome,然后右键单击
publish
请求并“复制为 cUrl”):
curl -4vvv -u guest:guest \
'localhost:15672/api/exchanges/%2F/amq.default/publish' \
-H 'Content-Type: text/plain;charset=UTF-8' \
--data-binary '{"vhost":"/","name":"amq.default","properties":{"delivery_mode":1,"headers":{}},"routing_key":"MY-QUEUE-NAME","delivery_mode":"1","payload":"TEST","headers":{},"props":{},"payload_encoding":"string"}'
对于那些对具有 ids 数组的 Intellij IDEA HTTP 客户端语法感兴趣的人
[
{"id": "83d6e4dc-0478-42da-8da0-65b508530a43"},
{"id": "08d3e147-79c4-4b91-be7c-b1cc86e21278"}
]
POST http://localhost:15672/api/exchanges/%2F/amqp.myexchange/publish
Authorization: Basic guest guest
Content-Type: application/json
{
"vhost": "/",
"name": "amqp.myexchange",
"properties": {
"delivery_mode": 2,
"headers": {},
"content_type": "application/json"
},
"routing_key": "",
"delivery_mode": "2",
"payload": "[{\"id\":\"83d6e4dc-0478-42da-8da0-65b508530a43\"},{\"id\":\"08d3e147-79c4-4b91-be7c-b1cc86e21278\"}]",
"headers": {},
"props": {
"content_type": "application/json"
},
"payload_encoding": "string"
}
C:\Program Files\RabbitMQ Server\rabbitmq_server-3.7.18\sbin>
C:\Program Files\RabbitMQ Server\rabbitmq_server-3.7.18\sbin>curl -i -u guest:guest localhost:15672/api/exchanges/%2F/amq.default/publish -H 'content-type:application/json" -d '{"vhost":"/","name":"amq.default","properties":{"delivery_mode":1,"headers":{}},"routing_key":"TEST,"delivery_mode":"1","payload":"TEST","headers":{},"props":{},"payload_encoding":"string"}'
HTTP/1.1 405 Method Not Allowed
allow: POST, OPTIONS
content-length: 0
content-security-policy: default-src 'self'
date: Fri, 06 Dec 2019 14:03:08 GMT
server: Cowboy
vary: origin
你是对的。我为这个错误道歉。将 RabbitMQ HTTP API 与 Postman 结合使用时,密码不应采用 base64 编码。相反,您应该使用 Postman 中的基本身份验证功能来发送凭据。
这是在 Postman 中包含身份验证的更正步骤:
POST
。http://localhost:15672/api/exchanges/{virtual-host}/{exchange-name}/publish
。
{virtual-host}
替换为您的虚拟主机的名称。默认虚拟主机是/
。{exchange-name}
替换为您的交易所名称。Content-Type
,值:application/json
raw
选项,然后从下拉列表中选择 JSON
。{
"properties": {},
"routing_key": "{queue-name}",
"payload": "Hello, RabbitMQ!",
"payload_encoding": "string"
}
{queue-name}
替换为您的队列名称。对于之前回复中的错误信息给您带来的困惑,我再次表示歉意。使用 RabbitMQ HTTP API 时,在 Postman 中使用基本身份验证是发送凭据的适当方法。