通过 EnOS SDK 调用 EnOS API


该教程通过若干示例,介绍如何通过 EnOS SDK 快速调用 EnOS API。

前提条件


调用 EnOS API 前,需确保已获取应用服务账号,并为应用分配 API 调用权限和资源访问权限。详细步骤,参考 API 鉴权

使用 Java SDK


EnOS API 都支持通过 EnOS 提供的 Java Core SDK (Poseidon) 进行调用。Poseidon 支持 Java 7 及以上版本。


备注

调用接入服务和资产服务 API 时,需要额外安装 Device And Asset API Pojo SDK。

安装方法

Java Core SDK (Poseidon)


访问 EnOS SDKs 和工具 页面,在 API SDKs 一栏中,查看 Java Core SDK 的版本信息和下载链接。下载其 Jar 安装包,在应用中引入 Jar 安装包。如果应用使用 pom 工程,则在 pom.xml 文件中加入以下依赖(需适时更新其版本):

<dependency>
  <groupId>com.envisioniot</groupId>
  <artifactId>apim-poseidon</artifactId>
  <version>0.2.4</version>
</dependency>


Device and Asset API Pojo SDK


访问 EnOS SDKs 和工具 页面,在 API SDKs 一栏中,查看 Device And Asset API Pojo SDK 的版本信息和下载链接。下载其 Jar 安装包,在应用中引入 Jar 安装包。如果应用使用 pom 工程,则在 pom.xml 文件中加入以下依赖(需适时更新其版本):

<dependency>
  <groupId>com.envisioniot</groupId>
  <artifactId>enos-dm-api-pojo</artifactId>
  <version>0.2.23</version>
</dependency>

使用方法

同步请求


  1. 关闭 API 日志功能,调用 API 后仅返回调用结果。示例代码如下:

    Poseidon.config(PConfig.init().appKey(accessKey).appSecret(secretKey))
            .url("https://{apigw-address}/{service-name}/{api-version}/{api_name}?{param1=value1&param2=value2}")
            .method("GET")
            .sync();
    


  2. 开启 API 日志功能,调用 API 后返回带时间戳的调用参数和调用结果。示例代码如下:

    Poseidon.config(PConfig.init().appKey(accessKey).appSecret(secretKey).debug())
            .url("https://{apigw-address}/{service-name}/{api-version}/{api_name}?{param1=value1&param2=value2}")
            .method("GET")
            .sync();
    


  3. GET 请求,支持独立设置 path。示例代码如下:

    Poseidon.config(PConfig.init().appKey(accessKey).appSecret(secretKey).debug())
                .url("https://{apigw-address}")
                .path("/{service-name}/{api-version}/{api_name}")
                .method("GET")
                .header("")
                .queryParam("param1","value1")
                .queryParam("param2","value2")
                .sync();
    

    备注

    .path(xxx) 方法一定要保证在 .queryParam(xxx,xxx) 函数方法之前调用。


  4. POST 请求,示例代码如下:

    Poseidon.config(PConfig.init().appKey(accessKey).appSecret(secretKey).debug())
                .url("https://{service-name}/{api-version}/{api_name}?{param1=value1&param2=value2}")
                .method("POST")
                .header("Content-Type", "application/json")
                .requestBody(
                    "{\n" + "  \"op\": \"pl\",\n" + "  \"offset\": 0,\n" + "  \"limit\": 10\n" + "}")
                .sync();
    

    备注

    Request header 为可选,可按需将请求内容的类型等规范包含在 header 中。

异步请求


示例代码如下:

Poseidon.config(PConfig.init().appKey(accessKey).appSecret(secretKey))
        .url("https://{apigw-address}/{service-name}/{api-version}/{api_name}?{param1=value1&param2=value2}")
        .method("GET").async( new PoseidonListener() {
              @Override
              public void onFailure(String errorMessage) {
                // TODO
              }

              @Override
              public void onResponse(String body) {
                // TODO
              }
            });

支持 Request 和 Response


Request 内置支持 Header,Query,RequestBody,Path 参数。Request 和 Response 的使用方法,参考以下示例 3 和示例 4。

异常处理


调用 API 的异常情况,可捕获 PoseidonException 查看具体问题。若 API 服务报错,可根据错误码,参考各 API 的说明文档。


PoseidonException 返回的常见报错信息和说明如下:

错误码

错误码描述

错误信息

错误原因

400

Bad Request

Cannot process request body.

获取 request body 失败。

401

Unauthorized

Invalid authentication credentials.

身份验证失败。

403

Forbidden

Your IP address is not allowed.

IP地址不允许访问。

413

Payload Too Large

Request size limit exceeded.

超出请求大小限制。

429

Too Many Requests

API rate limit exceeded.

超出API请求次数限制。

500

Internal Server Error

An unexpected error occurred.

查询缓存失败。

503

Service unavailable

Service unavailable.

服务禁止访问。

使用 Python SDK


EnOS Cloud API 服务支持通过 EnOS 提供的 Python SDK 进行调用,需安装 Python Core SDK(Athena)V0.1.4 及以上版本。Athena 支持 Python 3.6 及以上版本。


备注

EnOS Edge API 服务暂不支持 Python SDK。

安装方法


通过以下 pip 命令安装:

pip install aphrodite

使用方法

Query


from poseidon import poseidon

accessKey = 'accessKey'
secretKey = 'secretKey'

url = 'https://{apigw-address}/{service-name}/{api-version}/{api_name}?{param1=value1&param2=value2}'

req = poseidon.urlopen(accessKey, secretKey, url)
print(req)

Body


from poseidon import poseidon

accessKey = 'accessKey'
secretKey = 'secretKey'

url = 'https://{apigw-address}/{service-name}/{api-version}/{api_name}?{param1=value1&param2=value2}'

data = {"username": "abc", "password": "123"}

req = poseidon.urlopen(accesskey, secretkey, url, data)
print(req)

使用 GO SDK


EnOS Cloud API 服务和 EnOS Edge API 服务都支持通过 EnOS 提供的 Go SDK 进行调用。该 SDK 支持 Go 1.13 及以上版本。

安装方法


通过以下命令,在应用的 go.mod 中导入 SDK 完成安装:

require poseidon-sdk-go v0.0.0-20210421031313-9a8294f797c1

replace poseidon-sdk-go v0.0.0-20210421031313-9a8294f797c1 => git.envisioncn.com/edge/poseidon-sdk-go v0.0.0-20210421031313-9a8294f797c1

使用方法


  1. Get 请求关闭 API 日志功能,调用 API 后仅返回调用结果。示例代码如下:

    var header map[string]string
    res, err := poseidon.NewPoseidon().
         AppKey("accessKey").
         AppSecret("secretKey").
         Url("https://{apigw-address}/{service-name}/{api-version}/{api_name}?{param1=value1&param2=value2}").
         Header(header).
         Method(poseidon.MethodGet).
         Sync()
    


  2. Get 请求开启 API 日志功能,调用 API 后返回带时间戳的调用参数和调用结果。示例代码如下:

    var header map[string]string
    res, err := poseidon.NewPoseidon().
         AppKey("accessKey").
         AppSecret("secretKey").
         Url("https://{apigw-address}/{service-name}/{api-version}/{api_name}?{param1=value1&param2=value2}").
         Header(header).
         Method(poseidon.MethodGet).
         Debug().
         Sync()
    


  3. 对于 GET 请求,支持独立路径设置。示例代码如下:

    Poseidon.config(PConfig.init().appKey(accessKey).appSecret(secretKey).debug())
                .url("https://{apigw-address}")
                .path("/{service-name}/{api-version}/{api_name}")
                .method("GET")
                .header("")
                .queryParam("param1","value1")
                .queryParam("param2","value2")
                .sync();
    

    备注

    .path(xxx) 必须在 .queryParam(xxx,xxx) 之前调用。


  4. POST 请求,示例代码如下:

    type Testbody struct {
     Name string
    }
    
    var testbody Testbody
    testbody.Name = "UserName"
    var body interface{} = testbody
    var header map[string]string
    res, err := poseidon.NewPoseidon().
         AppKey("accessKey").
         AppSecret("secretKey").
         Url("https://{apigw-address}/{service-name}/{api-version}/{api_name}?{param1=value1&param2=value2}").
         Body(body).
         Header(header).
         Method(poseidon.MethodPost).
    


  5. 上传文件请求,示例代码如下:

    var bodyMap = make(map[string]string)
    bodyMap["file"] = "D:\\data\\file\\test.txt"
    var body interface{} = bodyMap
    var header = make(map[string]string)
    header["Content-Type"] = "multipart/form-data"
    res, err := poseidon.NewPoseidon().
         AppKey("accessKey").
         AppSecret("secretKey").
         Url("https://{apigw-address}/{service-name}/{api-version}/{api_name}?{param1=value1&param2=value2}").
         Body(body).
         Header(header).
         Method(poseidon.MethodPost).
         Sync()
    


  6. 下载文件请求,示例代码如下:

    var header = make(map[string]string)
    res, err := poseidon.NewPoseidon().
         AppKey("accessKey").
         AppSecret("secretKey").
         Url("https://{apigw-address}/{service-name}/{api-version}/{api_name}?{param1=value1&param2=value2}").
            Header(header).
            Method(poseidon.MethodPost).
            FilePath("D://data//file//").
            FileName("test.txt").
            Sync()
    


  7. 异常处理: Poseidon Struct 构造支持 Header、Body、和 Debug 参数。目前支持的请求方法为 Get、Post、Put、和 Delete。异常情况可由 Sync() 返回的 err 排查具体问题。

调用示例


开发环境准备完成后,参考各 API 参考文档中的参数说明和调用示例,调用 API。

示例 1 - 使用 Java Core SDK(GET 方法)


以下示例为使用 Java Core SDK 调用 Get Asset API,获取资产详细信息(关闭 API 日志功能):

import com.envision.apim.poseidon.config.PConfig;
import com.envision.apim.poseidon.core.Poseidon;

public class GetAsset {
    public static void main(String[] args) {

        String accessKey = "{access_key_of_the_application}";
        String secretKey = "{secret_key_of_the_application}";

        String response = Poseidon.config(PConfig.init().appKey(accessKey).appSecret(secretKey))
                .url("https://{apigw-address}/asset-service/v2.1/assets?action=get&orgId={org_id}&assetId={asset_id}")
                .method("GET")
                .sync();
        System.out.println(response);
        }
    }


以上示例代码运行完成后,返回数据示例为:

{
  "msg": OK,
  "code": 0,
  "data": {
    "modelId": "model_id",
    "assetId": "asset_id",
    "timezone": "+08:00",
    "name": {
      "i18nValue": {},
      "defaultValue": "asset_name"
    },
    "attributes": {
      "system": "System"
    },
    "modelIdPath": null,
    "orgId": "yourOrgId",
    "desc": null,
    "tags": {}
  },
  "requestId": "9a5cfbac-b2f8-4a37-b38d-8bccdd77d073"
}

示例 2 - 使用 Java Core SDK(POST 方法)


以下示例为使用 Java Core SDK 调用 Update Asset API,更新资产的名称、描述、属性、时区、标签信息(开启 API 日志功能):

import com.envision.apim.poseidon.config.PConfig;
import com.envision.apim.poseidon.core.Poseidon;

public class UpdateAsset {
    public static void main(String[] args) {

        String accessKey = "{access_key_of_the_application}";
        String secretKey = "{secret_key_of_the_application}";

        String data = "{\"asset\":{\"assetId\":\"{asset_id}\",\"name\":{\"defaultValue\":\"Device_Name\",\"i18nValue\":{\"en_US\":\"Device_Name\",\"zh_CN\":\"Chinese name\"}},\"description\":\"Device_Description\",\"attributes\":{\"Brand\":\"Brand_Name\"},\"timezone\":\"+07:00\",\"tags\":{\"year\":\"2019\",\"site\":\"Site_Name\"}}}";

        String response = Poseidon.config(PConfig.init().appKey(accessKey).appSecret(secretKey).debug())
                .url("https://{apigw-address}/asset-service/v2.1/assets?action=update&orgId={org_id}")
                .method("POST")
                .requestBody(data)
                .sync();
        System.out.println(response);
    }
}


以上示例代码运行完成后,返回数据示例为:

2019-7-10 16:35:12 [Poseidon] url: https://{apigw-address}/asset-service/v2.1/assets?action=update&orgId={org_id}
2019-7-10 16:35:12 [Poseidon] method: POST
2019-7-10 16:35:12 [Poseidon] headers: {}
2019-7-10 16:35:12 [Poseidon] requestBody: {"asset":{"assetId":"{asset_id}","name":{"defaultValue":"Device_Name","i18nValue":{"en_US":"Device_Name","zh_CN":"Chinese name"}},"description":"Device_Description","attributes":{"Brand":"Brand_Name"},"timezone":"+07:00","tags":{"year":"2019","site":"Site_Name"}}}
2019-7-10 16:35:13 [Poseidon] responseBody: {"code":0,"msg":"OK","requestId":"9d6b9869-4ffd-4964-a8ff-d150a0d1a91f","data":null}

示例 3 - 使用 Java Core SDK 和 Device And Asset API Pojo SDK(GET 方法)


以下示例为使用 Java Core SDK 和 Device and Asset API Pojo SDK 调用 GET Asset API,获取资产详细信息(开启 API 日志功能):

import com.envision.apim.poseidon.config.PConfig;
import com.envision.apim.poseidon.core.Poseidon;
import com.envisioniot.enos.asset_service.v2_1.GetAssetRequest;
import com.envisioniot.enos.asset_service.v2_1.GetAssetResponse;

public class GetAsset {
    private static String accessKey = "{access_key_of_the_application}";
    private static String secretKey = "{secret_key_of_the_application}";
    private static String orgId = "{org_id}";
    private static String url = "https://{apigw-address}";

    public static void main(String[] args) {
        GetAssetRequest request = new GetAssetRequest();
        request.setOrgId(orgId);
        request.setAssetId("{asset_id}");

        GetAssetResponse response = Poseidon.config(PConfig.init().appKey(accessKey).appSecret(secretKey).debug())
                .url(url)
                .getResponse(request, request.getResponseClass());
        System.out.println(response.getCode());
    }
}


以上示例代码运行完成后,返回数据示例为:

2019-7-10 11:02:27 [Poseidon] url: https://{apigw-address}/asset-service/v2.1/assets?action=get&assetId={asset_id}&orgId={org_id}
2019-7-10 11:02:27 [Poseidon] method: GET
2019-7-10 11:02:27 [Poseidon] headers: {}
2019-7-10 11:02:27 [Poseidon] requestBody: null
2019-7-10 11:02:29 [Poseidon] responseBody:{
  "msg": OK,
  "code": 0,
  "data": {
    "modelId": "model_id",
    "assetId": "asset_id",
    "timezone": "+08:00",
    "name": {
      "i18nValue": {},
      "defaultValue": "asset_name"
    },
    "attributes": {
      "system": "System"
    },
    "modelIdPath": null,
    "orgId": "yourOrgId",
    "desc": null,
    "tags": {}
  },
  "requestId": "39346a7e-1da8-42ec-9620-d44ef6e2e2b6"
}

示例 4 - 使用 Java Core SDK 和 Device and Asset API Pojo SDK(POST 方法)


以下示例为使用 Java Core SDK 和 Device and Asset API Pojo SDK 调用 Update Asset API,更新资产的描述、属性、时区信息(开启 API 日志功能):

import com.envision.apim.poseidon.config.PConfig;
import com.envision.apim.poseidon.core.Poseidon;
import com.envisioniot.enos.asset_service.v2_1.UpdateAssetRequest;
import com.envisioniot.enos.asset_service.v2_1.UpdateAssetResponse;
import com.envisioniot.enos.asset_service.vo.AssetUpdateVo;

import java.util.HashMap;
import java.util.Map;

public class UpdateAsset {
    private static String accessKey = "{access_key_of_the_application}";
    private static String secretKey = "{secret_key_of_the_application}";
    private static String orgId = "{org_id}";
    private static String url = "https://{apigw-address}";

    public static void main(String[] args) {
        UpdateAssetRequest request = new UpdateAssetRequest();
        request.setOrgId(orgId);

        AssetUpdateVo asset = new AssetUpdateVo();
        asset.setAssetId("{asset_id}");
        Map<String, Object> newAttrs = new HashMap<>();
        newAttrs.put("Brand","Brand_Name");
        asset.setAttributes(newAttrs);
        asset.setDescription("Device_Description");
        asset.setTimezone("+08:00");

        request.setAsset(asset);
        request.setIsPatchUpdate(true);

        UpdateAssetResponse response = Poseidon.config(PConfig.init().appKey(accessKey).appSecret(secretKey).debug())
                .url(url)
                .getResponse(request, request.getResponseClass());
        System.out.println(response);
    }
}


以上示例代码运行完成后,返回数据示例为:

2019-7-10 16:45:00 [Poseidon] url: https://{apigw-address}/asset-service/v2.1/assets?action=update&isPatchUpdate=true&orgId={org_id}
2019-7-10 16:45:00 [Poseidon] method: POST
2019-7-10 16:45:00 [Poseidon] headers: {}
2019-7-10 16:45:00 [Poseidon] requestBody: {"asset":{"assetId":"{asset_id}","attributes":{"Brand":"Brand_Name"},"description":"Device_Description","timezone":"+08:00"}}
2019-7-10 16:45:01 [Poseidon] responseBody: {"code":0,"msg":"OK","requestId":"4c1a6da8-bd89-4001-b8fd-5fa65ab816f2","data":null}