2015-12-10 2 views
7

Ich habe eine RabbitMQ 3.4.2 instance mit einem Web-Management-Plugin installiert.Wie kann ich mit dem Web-Plugin JSON-Nutzdaten an RabbitMQ senden?

Wenn ich die Nachricht {'operationId': 194} in die Warteschlange mit Pythons kombu Queue-Paket drücken, wird die Nachricht am anderen Ende als ein Wörterbuch gelesen.

Allerdings, wenn ich die Nachricht über die Web-Konsole senden:

enter image description here

Ich erhalte die folgende Fehlermeldung auf dem empfangenden Ende:

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

Ich habe versucht, das Hinzufügen eines content-type Kopf- und Eigentum, ohne Erfolg.

Da der Lesercode derselbe ist, bedeutet dies, dass der Webabsender die gesendete Nachricht nicht als JSON/Wörterbuchnutzlast markiert und daher am anderen Ende als Zeichenfolge gelesen wird.

Haben Sie eine Idee, wie Sie eine Nachricht mit der RabbitMQ-Webkonsole als JSON-Nachricht markieren?

Antwort

13

Ich musste content_type statt content-type (ein Unterstrich anstelle eines Bindestrichs) verwenden.

Dies ist eine ziemlich fragwürdige Designentscheidung, denn der Standard, den jeder kennt, ist content-type.

enter image description here

+0

Es ist kein HTTP-Header ... Es ist zu unterscheiden, dass der Schlüssel sowie die RabbitMQ Konvention der Verwendung von Unterstreichungen für seine Eigenschaften. – Jakub

1

Sie müssen den Ausgang deserialisieren.

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

Zusätzlich ist {'operationId': 194} kein gültiger JSON. Es sieht zwar so aus, als ob Sie im Screenshot doppelte Anführungszeichen verwenden, aber stellen Sie sicher, dass Sie die einfachen Anführungszeichen durch doppelte Anführungszeichen ersetzen.

Bearbeiten: Sie sind also richtig, Kombu sollte damit umgehen. Betrachtet man den Code, ist es wahrscheinlich, dass die Groß-/Kleinschreibung beachtet wird. Ändern Sie den Eigenschaftenheader von Content-Type in content-type.

+0

Das Komische ist, dass Nachrichten von Python-Code gesendet am empfangenden Ende keine Deserialisierung erfordern; daher denke ich, dass es einige Metadaten gibt, die die Arbeit für mich erledigen. Wenn ich '{'operationId': 194}' sende, wird es als Wörterbuch am anderen Ende empfangen. Ich möchte dieses Verhalten auch beim Senden von der Webkonsole haben. –

+0

@AdamMatan Sie haben Recht. Ich denke, das könnte so albern sein, wie der Header-Name Groß-und Kleinschreibung. – eandersson

+0

Ich hätte das aufgreifen sollen. Ich habe die gleiche Implementierung mit einem '' _ _''' in meiner eigenen amqp-Bibliothek. https://github.com/eandersson/amqp-storm/blob/master/amqpstorm/message.py#L208 – eandersson

Verwandte Themen