REST API

REST API

EMQX 提供了管理监控 REST API,这些 API 遵循 OpenAPI (Swagger) 3.0 规范。

EMQX 服务启动后,您可以访问 http://localhost:18083/api-docs/index.html REST API - 图1 (opens new window) 来查看 API 的文档。还可以直接在 Swagger UI 上尝试执行一些 API。

本章节将指导您快速开始使用 EMQX REST API。

基本路径

EMQX 在 REST API 上做了版本控制,EMQX 5.0.0 以后的所有 API 调用均以 /api/v5 开头。

认证

EMQX 的 REST API 使用 HTTP Basic 认证 REST API - 图2 (opens new window) 携带认证凭据,您可以在 Dashboard 系统设置 -> API 密钥 界面中创建用于认证的 API 密钥,详细操作请参考 Dashboard - API 密钥。

使用生成的 API Key 以及 Secret Key 分别作为 Basic 认证的用户名与密码,请求示例如下:

curl -X GET http://localhost:18083/api/v5/nodes \
     -u 4f33d24d7b8e448d:gwtbmFJZrnzUu8mPK1BxUkBA66PygETiDEegkf1q8dD \
     -H "Content-Type: application/json"
``` ```
import okhttp3.*;

import java.io.IOException;

public class EMQXNodesAPIExample {
    public static void main(String[] args) {
        try {
            String username = "4f33d24d7b8e448d";
            String password = "gwtbmFJZrnzUu8mPK1BxUkBA66PygETiDEegkf1q8dD";

            OkHttpClient client = new OkHttpClient();

            Request request = new Request.Builder()
                    .url("http://localhost:18083/api/v5/nodes")
                    .header("Content-Type", "application/json")
                    .header("Authorization", Credentials.basic(username, password))
                    .build();

            Response response = client.newCall(request).execute();
            System.out.println(response.body().string());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
``` ```
import urllib.request
import json
import base64

username = '4f33d24d7b8e448d'
password = 'gwtbmFJZrnzUu8mPK1BxUkBA66PygETiDEegkf1q8dD'

url = 'http://localhost:18083/api/v5/nodes'

req = urllib.request.Request(url)
req.add_header('Content-Type', 'application/json')

auth_header = "Basic " + base64.b64encode((username + ":" + password).encode()).decode()
req.add_header('Authorization', auth_header)

with urllib.request.urlopen(req) as response:
    data = json.loads(response.read().decode())

print(data)
``` ```
package main

import (
    "fmt"
    "net/http"
    "bytes"
    "encoding/json"
)

func main() {
    username := "4f33d24d7b8e448d"
    password := "gwtbmFJZrnzUu8mPK1BxUkBA66PygETiDEegkf1q8dD"

    url := "http://localhost:18083/api/v5/nodes"

    req, err := http.NewRequest("GET", url, nil)
    if err != nil {
        panic(err)
    }
    req.SetBasicAuth(username, password)
    req.Header.Set("Content-Type", "application/json")

    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()

    buf := new(bytes.Buffer)
    _, err = buf.ReadFrom(resp.Body)
    if err != nil {
        panic(err)
    }

    var data interface{}
    json.Unmarshal(buf.Bytes(), &data)
    fmt.Println(data)
}
``` ```
const axios = require('axios')

const username = '4f33d24d7b8e448d'
const password = 'gwtbmFJZrnzUu8mPK1BxUkBA66PygETiDEegkf1q8dD'

axios
  .get('http://localhost:18083/api/v5/nodes', {
    auth: {
      username: username,
      password: password,
    },
    headers: {
      'Content-Type': 'application/json',
    },
  })
  .then((response) => {
    console.log(response.data)
  })
  .catch((error) => {
    console.log(error)
  })

HTTP 请求头

除非有特殊说明,绝大多数 API 要求请求头中 Accept 值设置为 application/json,响应内容将以 JSON 格式返回。

HTTP 响应状态码

EMQX 遵循HTTP 响应状态码 REST API - 图3 (opens new window)标准,可能的状态码如下:

状态码 描述
200 请求成功,返回的 JSON 数据将提供更多信息
201 创建成功,新建的对象将在 Body 中返回
204 请求成功,常用于删除与更新操作,Body 不会返回内容
400 请求无效,例如请求体或参数错误
401 未通过服务端认证,API 密钥过期或不存在时可能会发生
403 无权操作,检查操作对象是否正在使用或有依赖约束
404 找不到请求路径或请求的对象不存在,可参照 Body 中的 message 字段判断具体原因
409 请求的资源已存在或数量超过限制
500 服务端处理请求时发生内部错误,可通过 Body 返回内容与日志判断具体原因

错误码

HTTP 响应状态码能够直观的判断可能存在的问题,在此基础上 EMQX 定义了一系列的错误码来标识具体的错误原因。当发生错误时,错误码将通过 Body 以 JSON 格式返回,您可以根据错误码 code 了解错误分类,根据原因 reason 了解具体的错误信息:

```

GET /clients/foo

{ "code": "RESOURCE_NOT_FOUND", "reason": "Client id not found" } ``` 错误码| 描述
---|---
WRONG_USERNAME_OR_PWD| Wrong username or password
WRONG_USERNAME_OR_PWD_OR_API_KEY_OR_API_SECRET| Wrong username & password or key & secret
BAD_REQUEST| Request parameters not legal
NOT_MATCH| Conditions not matched
ALREADY_EXISTS| Resources already exist
BAD_CONFIG_SCHEMA| Configuration data not legal
BAD_LISTENER_ID| Bad listener ID
BAD_NODE_NAME| Bad Node Name
BAD_RPC| RPC Failed. Check the cluster status and the requested node status
BAD_TOPIC| Topic syntax error, topic needs to comply with the MQTT protocol standard
EXCEED_LIMIT| Resources to be created exceed the maximum limit or minimum limit
INVALID_PARAMETER| Request parameters not legal and exceed the boundary value
CONFLICT| Conflicting request resources
NO_DEFAULT_VALUE| Request parameters do not use default values
DEPENDENCY_EXISTS| Resource depends on other resources
MESSAGE_ID_SCHEMA_ERROR| Message ID parsing error
INVALID_ID| Bad ID schema
MESSAGE_ID_NOT_FOUND| Message ID does not exist
NOT_FOUND| Resource not found or does not exist
CLIENTID_NOT_FOUND| Client ID not found or does not exist
CLIENT_NOT_FOUND| Client not found or does not exist(usually not an MQTT client)
RESOURCE_NOT_FOUND| Resource not found
TOPIC_NOT_FOUND| Topic not found
USER_NOT_FOUND| User not found
INTERNAL_ERROR| Server inter error
SERVICE_UNAVAILABLE| Service unavailable
SOURCE_ERROR| Source error
UPDATE_FAILED| Update fails
REST_FAILED| Reset source or configuration fails
CLIENT_NOT_RESPONSE| Client not responding