L’API HTTP de management permet d’une part de créer, modifier des entités (exchanges, queues) de RabbitMQ, mais aussi de lire ou publier des messages.
Cette page traite très partiellement le sujet. Il y aura peut-être plus de contenu plus tard…
Installation
Pour activer l’API de management, il faut le même plugin que pour la console.
$~ rabbitmq-plugins enable --offline rabbitmq_management
En local, la racine de l’API est http://localhost:15672/api.
Il faut aussi un utilisateur avec un tag management
ou administrator
.
{
"name": "test",
"password_hash": "...",
"tags": ["management"]
}
L’utilisateur doit avoir les permissions sur les entités, configure pour les créer ou modifier, read/write pour échanger des messages.
{
"user": "test",
"vhost": "/",
"read": ".",
"write": "."
}
La méthode d’authentification est BASIC.
Manipulation d’entités
Vue globale
$~ curl http://localhost:15672/api/overview
{
"management_version": "3.12.2",
"rates_mode": "basic",
"sample_retention_policies": {...},
"exchange_types": [
{
"name": "direct",
"description": "AMQP direct exchange, as per the AMQP specification",
"enabled": true
},
...
],
"product_version": "3.12.2",
"product_name": "RabbitMQ",
"rabbitmq_version": "3.12.2",
"cluster_name": "rabbitmq",
...
}
Connexions
Liste de toutes les connexions
$~ curl http://localhost:15672/api/connexions
[
{
"auth_mechanism": "PLAIN",
"channel_max": 2047,
"channels": 60,
"client_properties": {
"capabilities": {
"authentication_failure_close": true,
"basic.nack": true,
"connection.blocked": true,
"consumer_cancel_notify": true,
"exchange_exchange_bindings": true,
"publisher_confirms": true
},
"connection_name": "rabbitConnectionFactory#3fe3bbff:0",
"copyright": "Copyright (c) 2007-2021 VMware, Inc. or its affiliates.",
"information": "Licensed under the MPL. See https://www.rabbitmq.com/",
"platform": "Java",
"product": "RabbitMQ",
"version": "5.19.0"
},
"connected_at": 1717690184514,
"host": "172.27.4.148",
"port": 5672,
"name": "172.27.4.146:42240 -> 172.27.4.148:5672",
"peer_host": "172.27.4.146",
"peer_port": 42240,
"protocol": "AMQP 0-9-1",
"user": "datamgmt-dev",
"vhost": "/dev",
...
},
...
]
Canaux
Liste de tous les canaux
$~ curl http://localhost:15672/api/channels
[
{
"name": "172.27.4.146:42240 -> 172.27.4.148:5672 (1)",
"connection_details": {
"name": "172.27.4.146:42240 -> 172.27.4.148:5672",
"peer_host": "172.27.4.146",
"peer_port": 42240
},
"consumer_count": 1,
"idle_since": "2024-06-06T16:10:03.006+00:00",
"state": "running",
"vhost": "/dev",
...
},
...
]
Liste des canaux d’une connexion
$~ curl http://localhost:15672/api/connections/<name>/channels
Envoi de message
L’envoi d’un message se fait par un POST sur le endpoint /api/exchanges/<vhost>/<echange>/publish/
.
Par exemple, pour envoyer un message sur l’exchange par défaut (nom vide) du virtual host /
, en local:
$~ curl http://localhost:15672/api/exchanges/%2f//publish \
--user test:test-pwd --request POST \
--data '...'
Le contenu du POST est en JSON. Il a quatre propriétés:
-
properties
, dont les en-têtes -
routing_key
-
payload
-
payload_encoding
qui peut êtrestring
poubase64
Avec un payload texte, si c’est du JSON, ça fait du JinJ (JSON in JSON) avec des échappements de doubles-quotes.
$~ payload='{"id": "3172fc96-4786-4146-ad80-4c993f64db30", "description": "Hello World"}'
$~ curl http://localhost:15672/api/exchanges/%2f//publish \
--user test:test-pwd --request POST \
--data @- <<EOF
{
"properties":{
"headers": {
"event-type": "hello"
}
},
"routing_key":"q.jtips",
"payload":"${payload//\"/\\\"}",
"payload_encoding":"string"
}
EOF
Sinon, on peut opter pour un payload base64.
$~ payload='{"id": "3172fc96-4786-4146-ad80-4c993f64db30", "description": "Hello World"}'
$~ payload64=$(echo $payload | base64)
$~ curl http://localhost:15672/api/exchanges/%2f//publish \
--user test:test-pwd --request POST \
--data @- <<EOF
{
"properties":{
"headers": {
"event-type": "hello"
}
},
"routing_key":"q.ah.test",
"payload":"$payload64",
"payload_encoding":"base64"
}
EOF
Références