【问题标题】:How to send JSON payload to RabbitMQ using the web plugin?如何使用 Web 插件将 JSON 有效负载发送到 RabbitMQ?
【发布时间】:2016-03-16 00:31:03
【问题描述】:

我有一个安装了网络管理插件的RabbitMQ 3.4.2 instance

当我使用 Python 的 kombu 队列包将消息 {'operationId': 194} 推送到队列时,消息在另一端作为字典读取。

但是,当我使用 Web 控制台发送消息时:

我在接收端收到以下错误:

operation_id = payload['operationId']
TypeError: string indices must be integers

我尝试添加 content-type 标头和属性,但没有成功。

由于阅读器代码相同,表示网络发送方没有将发送的消息标记为JSON/字典载荷,因此在另一端读取为字符串。

知道如何使用 RabbitMQ Web 控制台将消息标记为 JSON 消息吗?

【问题讨论】:

    标签: python json queue rabbitmq


    【解决方案1】:

    我必须使用content_type 而不是content-type(下划线而不是连字符)。

    这是一个非常值得怀疑的设计决定,因为每个人都知道的标准是content-type

    【讨论】:

    • 它不是 HTTP Header...这是为了将其与所述键区分开来,并遵守 RabbitMQ 使用下划线作为其属性的约定。
    【解决方案2】:

    你需要反序列化输出。

    import json
    payload = json.loads(payload)
    operation_id = payload['operationId']
    

    此外,{'operationId': 194} 不是有效的 JSON。虽然看起来您在屏幕截图中使用了双引号,但请确保将单引号替换为双引号。

    编辑: 所以你是对的,kombu 应该处理这个问题。查看代码很可能标头区分大小写。将属性标题从 Content-Type 更改为 content-type

    【讨论】:

    • 有趣的是,从 Python 代码发送的消息在接收端不需要反序列化;因此,我想有一些元数据可以为我完成这项工作。当我发送{'operationId': 194} 时,它在另一端作为字典接收。从 Web 控制台发送时,我也希望有这种行为。
    • @AdamMatan 你是对的。我认为这可能与 Header 名称区分大小写一样愚蠢。
    • 我应该知道的。我在自己的 amqp 库中使用 _ 进行了相同的实现。 github.com/eandersson/amqp-storm/blob/master/amqpstorm/…
    • 不错的一个!为什么你自己构建而不是使用 Kombu 或类似的东西?
    • 我想要一些更简单的东西,有一个后台线程来跟踪心跳等。
    猜你喜欢
    • 1970-01-01
    • 2023-01-25
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 2016-11-23
    • 1970-01-01
    相关资源
    最近更新 更多