2015-12-10 17 views
7

Ho un RabbitMQ 3.4.2 instance con un plug-in di gestione Web installato.Come inviare payload JSON a RabbitMQ usando il plugin web?

Quando si invia il messaggio {'operationId': 194} alla coda utilizzando il pacchetto code Python kombu, il messaggio viene letto sull'altro lato come dizionario.

Tuttavia, quando inviare il messaggio utilizzando la console web:

enter image description here

ottengo il seguente errore sul lato sbagliato:

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

Ho provato ad aggiungere un colpo di testa content-type e proprietà, senza successo.

Poiché il codice del lettore è lo stesso, significa che il mittente Web non contrassegna il messaggio inviato come un payload del dizionario JSON/e pertanto viene letto come una stringa sull'altra estremità.

Qualche idea su come contrassegnare un messaggio come messaggio JSON utilizzando la console Web RabbitMQ?

risposta

13

Ho dovuto utilizzare content_type anziché content-type (un trattino di sottolineatura anziché un trattino).

Questa è una decisione di progettazione piuttosto discutibile, perché lo standard che tutti conoscono è content-type.

enter image description here

+0

Non è un'intestazione HTTP ... È per distinguere quella da detta chiave e aderire alla convenzione RabbitMQ di utilizzare i trattini bassi per le sue proprietà. – Jakub

1

È necessario deserializzare l'uscita.

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

Inoltre {'operationId': 194} non è valido JSON. Sebbene sembri utilizzare le doppie virgolette nello screenshot, assicurati di sostituire le virgolette singole con virgolette doppie.

Modifica: Quindi si è corretto, Kombu dovrebbe gestire questo. Guardando il codice è probabile che l'intestazione sia sensibile al maiuscolo/minuscolo. Modificare l'intestazione delle proprietà da Content-Type a content-type.

+0

La cosa divertente è che i messaggi inviati da codice Python richiede alcuna deserializzazione sul lato sbagliato; quindi, immagino ci siano alcuni metadati che fanno il lavoro per me. Quando invio '{'IE': 194}' viene ricevuto come dizionario dall'altra parte. Voglio avere questo comportamento quando invio dalla console web, anche. –

+0

@AdamMatan Hai ragione. Penso che questo potrebbe essere sciocco come il nome dell'intestazione che fa distinzione tra maiuscole e minuscole. – eandersson

+0

Avrei dovuto capirlo. Ho la stessa implementazione usando un '' '_''' nella mia libreria amqp. https://github.com/eandersson/amqp-storm/blob/master/amqpstorm/message.py#L208 – eandersson