使用 HTTP API 发布到 RabbitMQ 队列

问题描述 投票:0回答:4

已阅读文档(https://cdn.rawgit.com/rabbitmq/rabbitmq-management/v3.7.9/priv/www/api/index.html

并且没有找到使用 HTTP API 将消息发布到 queue(不是交换器,而是队列)的方法?

这可能吗?

尽管它在生产思维中可能没有多大意义,但它对于测试目的仍然很有用。

我基本上想模仿 RabbitMQ 管理控制台中提供的“发布消息”界面。

这有可能吗?

rabbitmq
4个回答
9
投票

注意:您的问题已经得到解答这里链接

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"}'

3
投票

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

-1
投票
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

-1
投票

你是对的。我为这个错误道歉。将 RabbitMQ HTTP API 与 Postman 结合使用时,密码不应采用 base64 编码。相反,您应该使用 Postman 中的基本身份验证功能来发送凭据。

这是在 Postman 中包含身份验证的更正步骤:

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

对于之前回复中的错误信息给您带来的困惑,我再次表示歉意。使用 RabbitMQ HTTP API 时,在 Postman 中使用基本身份验证是发送凭据的适当方法。

© www.soinside.com 2019 - 2024. All rights reserved.