使用HTTP API发布到RabbitMQ队列

j9per5c4  于 2023-06-23  发布在  RabbitMQ
关注(0)|答案(5)|浏览(204)

浏览文档(https://cdn.rawgit.com/rabbitmq/rabbitmq-management/v3.7.9/priv/www/api/index.html
没有找到一种方法来发布一个消息到一个 * 队列 *(不是一个交换,一个队列)与HTTP API?
这可能吗?
尽管它在生产思维中可能没有什么意义,但它仍然可以用于测试目的。
我基本上想模仿RabbitMQ管理控制台中可用的“发布消息”界面。
这可能吗?

pu82cl6c

pu82cl6c1#

注意:您的问题已经回答herelink
RabbitMQ只支持发布到交易所。这是产品的核心功能。然后,RabbitMQ使用绑定来确定哪个队列应该接收消息。
您可以阅读这些概念here
当您在管理控制台中使用“发布消息”时,它使用默认绑定和默认交换。this document

默认交换

在本教程的前几部分中,我们对交换一无所知,但仍然能够向队列发送消息。这是可能的,因为我们使用的是默认的交换,我们用空字符串(“”)来标识它。
回想一下我们之前是如何发布消息的:

channel.basic_publish(exchange='',
                      routing_key='hello',
                      body=message)

exchange参数是exchange的名称。空字符串表示默认或无名交换:消息被路由到具有routing_key指定名称的队列(如果存在)。
因此,为了“看起来”直接发布到队列,管理接口使用队列名称作为路由关键字将消息发布到默认交换(命名为amq.default或空字符串"")。您可以通过在浏览器中启用开发人员工具并在向队列发布消息时观察对/api/exchanges/vhost/name/publish的HTTP调用来亲眼看到这一点。
在您的示例中,请求看起来像这样(使用Chrome,右键单击publish请求并“copy as 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"}'

**注意:**RabbitMQ团队监控rabbitmq-users邮件列表,仅在StackOverflow上偶尔回答问题。

epfja78i

epfja78i2#

对于那些对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"
}
zxlwwiss

zxlwwiss3#

我知道这篇文章很旧了,但也许还能找到。这里有一个第三方工具,可以帮助在这种情况下,当你需要发布一个消息直接到队列:
https://github.com/bkrieger1991/rabbitcli

s3fp2yjn

s3fp2yjn4#

你说得对。我为这个错误道歉。当使用RabbitMQ HTTP API和Postman时,密码不应该是base64编码的。相反,您应该使用Postman中的基本身份验证功能来发送凭据。
以下是在Postman中包含身份验证的更正步骤:
1.打开Postman并创建新请求。
1.将请求方法设置为POST

  • 输入RabbitMQ API的URL,包括虚拟主机和队列名称。例如:http://localhost:15672/api/exchanges/{virtual-host}/{exchange-name}/publish
  • {virtual-host}替换为虚拟主机的名称。默认虚拟主机为/
  • {exchange-name}替换为您的交易所名称。
  • 转到“Headers”部分并添加以下标题:
  • 键:Content-Type,值:application/json
  • 单击URL输入字段下方的“授权”选项卡。
  • 选择“基本身份验证”类型。
  • 请输入您的用户名和密码登录
  • 在请求正文中,选择raw选项,然后从下拉列表中选择JSON
  • 在请求正文中输入消息的JSON有效负载。例如:
{
  "properties": {},
  "routing_key": "{queue-name}",
  "payload": "Hello, RabbitMQ!",
  "payload_encoding": "string"
}
  • {queue-name}替换为您的队列名称。
  • 根据您的要求调整有效负载和有效负载编码。
  • 点击“发送”按钮将消息发布到RabbitMQ队列。

我再次为我之前回复中的错误信息造成的混乱道歉。在Postman中使用基本身份验证是在使用RabbitMQ HTTP API时发送凭据的适当方法。

wh6knrhe

wh6knrhe5#

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

相关问题