Skip to content

REST API

EMQXはOpenAPI(Swagger)3.0仕様に準拠したHTTP管理APIを公開しています。

EMQX起動後、http://localhost:18083/api-docs/index.html にアクセスするとAPIドキュメントを閲覧でき、Swagger UIから管理APIを実行できます。デフォルトでは、Dashboardの設定で swagger_supporttrue に設定されており、Swagger UIが有効であることを示しています。これにより、インタラクティブなAPIドキュメントの生成など、Swagger関連機能がすべて有効になります。無効化したい場合は false に設定してください。詳細はDashboard設定を参照してください。

本節ではEMQX REST APIの利用方法を紹介します。

基本パス

EMQXのREST APIはバージョン管理されており、EMQX 5.0.0以降のすべてのAPIパスは /api/v5 から始まります。

HTTPヘッダー

ほとんどのAPIリクエストでは Accept ヘッダーに application/json を設定する必要があり、指定がなければレスポンスはJSON形式で返されます。

HTTPレスポンスステータスコード

EMQXはHTTPレスポンスステータスコードの標準に準拠しています。主なステータスコードは以下の通りです。

コード説明
200リクエスト成功。返却されるJSONデータに詳細が含まれます。
201作成成功。新規オブジェクトがBodyに返されます。
204リクエスト成功。通常は削除や更新操作で、Bodyは空です。
400不正なリクエスト。リクエストボディやパラメータのエラー。
401認証エラー。APIキーが期限切れまたは存在しません。
403禁止。オブジェクトが使用中、または依存関係の制約があります。
404見つかりません。Bodyの message フィールドで理由を確認可能。
409コンフリクト。オブジェクトが既に存在するか、数の上限超過。
500サーバ内部エラー。Bodyやログで原因を確認してください。

認証

EMQXのREST APIは主にAPIキーを用いたBasic認証とBearerトークン認証の2種類をサポートしています。

APIキーを用いたBasic認証

この方法では、APIキーとシークレットキーをそれぞれユーザー名とパスワードとしてAPIリクエストを認証します。EMQXのREST APIはHTTP Basic Authenticationに準拠しており、これらの認証情報が必要です。EMQX REST APIを利用する前にAPIキーを作成してください。

注意

セキュリティ上の理由から、EMQX 5.0.0以降はDashboardユーザーの認証情報でREST APIを認証できません。代わりにAPIキーを作成し、認証に使用してください。

APIキーの作成

Dashboardの System -> API Key から手動でAPIキーを作成できます。詳細はSystem - API Keysを参照してください。

また、ブートストラップファイル方式でAPIキーを作成することも可能です。以下の設定ファイルでファイルパスを指定します。

bash
api_key = {
  bootstrap_file = "etc/default_api_key.conf"
}

指定ファイル内に複数のAPIキーを以下の形式で改行区切りで記述します。

{API Key}:{Secret Key}:{?Role}
  • API Key:任意の文字列でキー識別子
  • Secret Key:ランダムな文字列をシークレットキーとして使用
  • Role(任意):キーのロールを指定

例:

bash
my-app:AAA4A275-BEEC-4AF8-B70B-DAAC0341F8EB
ec3907f865805db0:Ee3taYltUKtoBVD9C3XjQl9C6NXheip8Z9B69BpUv5JxVHL:viewer
foo:3CA92E5F-30AB-41F5-B3E6-8D7E213BE97E:publisher

この方法で作成したAPIキーは無期限で有効です。

EMQX起動時にファイル内のデータがAPIキーリストに追加され、既存のAPIキーがあればSecret KeyとRoleが更新されます。

ロールと権限

REST APIはロールベースアクセス制御を実装しています。APIキー作成時に以下の3つの定義済みロールのいずれかを割り当てられます。

  • Administrator:すべてのリソースにアクセス可能。ロール指定がない場合のデフォルト。ロール識別子は administrator
  • Viewer:リソースやデータの閲覧のみ可能。REST APIのすべてのGETリクエストに対応。ロール識別子は viewer
  • Publisher:MQTTメッセージのパブリッシュ専用。メッセージパブリッシュ関連APIのみアクセス可能。ロール識別子は publisher

APIキーを用いた認証方法

APIキーとシークレットキーを用いてリクエストを認証します。APIキーがユーザー名、シークレットキーがパスワードとしてBasic認証に利用されます。

各言語での例:

Bearerトークンを用いた認証

APIキー認証の代替として、Bearerトークンを使った安全かつプログラム的なEMQX REST APIアクセスが可能です。Bearerトークンは以下のログインAPIエンドポイントにリクエストを送信して取得します。

Bearerトークンの取得

以下のログインAPIエンドポイントにHTTP POST リクエストを送信してください。

bash
POST http://your-emqx-address:8483/api/v5/login

ヘッダー:

  • Content-Type: application/json

リクエストボディ:

json
{
  "username": "admin",
  "password": "yourpassword"
}
  • your-emqx-address はEMQXノードのアドレスまたはIPに置き換えてください。
  • "admin""yourpassword" はEMQX Dashboardの認証情報に置き換えてください。

レスポンスにBearerトークンが含まれ、APIリクエストの認証に利用できます。

Bearerトークンを用いた認証方法

Bearerトークンを取得したら、APIリクエストの Authorization ヘッダーに以下のように含めてください。

bash
--header "Authorization: Bearer <your-token>"

ページネーション

大量データを扱う一部APIではページネーション機能が提供されています。データの特性に応じて2種類のページネーション方式があります。

ページ番号方式

ページネーション対応APIの多くは、page(ページ番号)と limit(ページサイズ)パラメータで制御します。最大ページサイズは 10000 です。limit 指定がない場合はデフォルトで 100 となります。

例:

bash
GET /clients?page=1&limit=100

レスポンスの meta フィールドにページネーション情報が含まれます。EMQXは検索条件付きリクエストの総件数を予測できないため、meta.hasnext フィールドで次ページの有無を示します。

json
{
  "data":[],
  "meta":{
    "count":0,
    "limit":20,
    "page":1,
    "hasnext":false
  }
}

カーソル方式

データが急速に変化し、ページ番号方式が非効率な一部APIではカーソル方式を採用しています。

position または cursor(開始位置)パラメータでデータの開始位置を指定し、limit(ページサイズ)パラメータで開始位置から取得する件数を指定します。最大ページサイズは 10000 です。limit 指定がない場合はデフォルトで 100 となります。

例:

bash
GET /clients/{clientid}/mqueue_messages?position=1716187698257189921_0&limit=100

レスポンスの meta フィールドにページネーション情報が含まれ、meta.position または meta.cursor に次ページの開始位置が示されます。

json
{
    "meta": {
        "start": "1716187698009179275_0",
        "position": "1716187698491337643_0"
    },
    "data": [
        {
            "inserted_at": "1716187698260190832",
            "publish_at": 1716187698260,
            "from_clientid": "mqttx_70e2eecf_10",
            "from_username": "undefined",
            "msgid": "000618DD161F682DF4450000F4160011",
            "mqueue_priority": 0,
            "qos": 0,
            "topic": "t/1",
            "payload": "SGVsbG8gRnJvbSBNUVRUWCBDTEk="
        }
    ]
}

この方式はデータ変動が激しいシナリオで連続性と効率性を確保します。

エラーコード

HTTPレスポンスステータスコードに加え、EMQXは特定のエラーを識別するためのエラーコード一覧を定義しています。

エラー発生時はBodyにJSON形式でエラーコードが返されます。

bash
# GET /clients/foo

{
  "code": "RESOURCE_NOT_FOUND",
  "reason": "Client id not found"
}
エラーコード説明
WRONG_USERNAME_OR_PWDユーザー名またはパスワードが間違っています
WRONG_USERNAME_OR_PWD_OR_API_KEY_OR_API_SECRETユーザー名&パスワードまたはキー&シークレットが間違っています
BAD_REQUESTリクエストパラメータが不正です
NOT_MATCH条件が一致しません
ALREADY_EXISTSリソースが既に存在します
BAD_CONFIG_SCHEMA設定データが不正です
BAD_LISTENER_IDリスナーIDが不正です
BAD_NODE_NAMEノード名が不正です
BAD_RPCRPC失敗。クラスター状態および対象ノードの状態を確認してください
BAD_TOPICトピックの構文エラー。トピックはMQTTプロトコル標準に準拠する必要があります
EXCEED_LIMIT作成リソースが最大または最小制限を超えています
INVALID_PARAMETERリクエストパラメータが不正または境界値を超えています
CONFLICTリクエストリソースに競合があります
NO_DEFAULT_VALUEリクエストパラメータにデフォルト値が使用されていません
DEPENDENCY_EXISTSリソースが他のリソースに依存しています
MESSAGE_ID_SCHEMA_ERRORメッセージIDの解析エラー
INVALID_IDIDスキーマが不正です
MESSAGE_ID_NOT_FOUNDメッセージIDが存在しません
NOT_FOUNDリソースが見つかりません
CLIENTID_NOT_FOUNDクライアントIDが見つかりません
CLIENT_NOT_FOUNDクライアントが見つかりません(通常はMQTTクライアントではない)
RESOURCE_NOT_FOUNDリソースが見つかりません
TOPIC_NOT_FOUNDトピックが見つかりません
USER_NOT_FOUNDユーザーが見つかりません
INTERNAL_ERRORサーバ内部エラー
SERVICE_UNAVAILABLEサービス利用不可
SOURCE_ERRORソースエラー
UPDATE_FAILED更新失敗
REST_FAILEDリセットソースまたは設定失敗
CLIENT_NOT_RESPONSEクライアントが応答しません