通过 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>
使用方法¶
同步请求¶
关闭 API 日志功能,调用 API 后仅返回调用结果。示例代码如下:
Poseidon.config(PConfig.init().appKey(accessKey).appSecret(secretKey)) .url("https://{apigw-address}/{service-name}/{api-version}/{api_name}?{param1=value1¶m2=value2}") .method("GET") .sync();
开启 API 日志功能,调用 API 后返回带时间戳的调用参数和调用结果。示例代码如下:
Poseidon.config(PConfig.init().appKey(accessKey).appSecret(secretKey).debug()) .url("https://{apigw-address}/{service-name}/{api-version}/{api_name}?{param1=value1¶m2=value2}") .method("GET") .sync();
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) 函数方法之前调用。
POST 请求,示例代码如下:
Poseidon.config(PConfig.init().appKey(accessKey).appSecret(secretKey).debug()) .url("https://{service-name}/{api-version}/{api_name}?{param1=value1¶m2=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¶m2=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¶m2=value2}'
req = poseidon.urlopen(accessKey, secretKey, url)
print(req)
Header¶
from poseidon import poseidon
accessKey = 'accessKey'
secretKey = 'secretKey'
url = 'https://{apigw-address}/{service-name}/{api-version}/{api_name}?{param1=value1¶m2=value2}'
header={}
req = poseidon.urlopen(accessKey, secretKey, url, None, header)
print(req)
Body¶
from poseidon import poseidon
accessKey = 'accessKey'
secretKey = 'secretKey'
url = 'https://{apigw-address}/{service-name}/{api-version}/{api_name}?{param1=value1¶m2=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
使用方法¶
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¶m2=value2}"). Header(header). Method(poseidon.MethodGet). Sync()
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¶m2=value2}"). Header(header). Method(poseidon.MethodGet). Debug(). Sync()
对于 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) 之前调用。
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¶m2=value2}"). Body(body). Header(header). Method(poseidon.MethodPost).
上传文件请求,示例代码如下:
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¶m2=value2}"). Body(body). Header(header). Method(poseidon.MethodPost). Sync()
下载文件请求,示例代码如下:
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¶m2=value2}"). Header(header). Method(poseidon.MethodPost). FilePath("D://data//file//"). FileName("test.txt"). Sync()
异常处理: 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}