关于API接入

本节将会通过一个示例介绍API的接入流程,也可参考AutoAI官方API 文档综览。需要JAVA/GO/PHP/Python等语言的参考,可以参考AutoAI SDK框架AutoAI SDK项目

API调用示例

本节通过一个具体的示例(获取设备影子)介绍如何实现API调用。用户可将其中的参数换成自己的实际参数进行测试。

1. 概述
接口的调用使用HTTP GET或POST调用都可以得到相同的结果。调用的参数包括接口的参数+公共参数+参数签名三部分。

  • 接口参数:某个具体接口需要的参数;
  • 公共参数:每个接口都需要用到的,包括调用接口名、项目名、公钥等
  • 签名:通过私钥签名,方便网关鉴权。

2. 查看接口文档获取接口名及参数

名称 内容
接口名 GetUIoTCoreDeviceShadow - 获取设备影子。
接口参数Region:上海二区,地域ID为 cn-sh2ProductSN:产品序列号为 8pi2i730vxsala2a,通过控制台查看。 DeviceSN:设备序列号为ark1d4ug1evfb1jy,通过控制台查看。

3. 获取公共参数,即每次请求都需要的参数

名称内容
ActionAPI名称,此例为 GetUIoTCoreDeviceShadow
PublicKey用户公钥为CJf+LfjjXPk70z/fsBlK9sHC+kBTTj7gr2g/C/R7YSi3EFTKCmh7Bp5W1UH64D/O,通过个人中心→API密钥获取。
Signature用户签名将在第3步介绍。
ProjectId项目ID为 org-z44lmf12e,项目ID为 org-z44lmf12e,通过控制台首页查看。主账号为空时为默认项目,子账号为必填字段。

4. 获取用户签名
用户签名需要接口参数和公共参数以及用户私钥参与一起完成。

1) 接口参数+公共参数

// 接口参数
Region:cn-sh2
ProductSN:8pi2i730vxsala2a
DeviceSN:ark1d4ug1evfb1jy
// 公共参数,Signature加密后获取
Action:GetUIoTCoreDeviceShadow
PublicKey:CJf+LfjjXPk70z/fsBlK9sHC+kBTTj7gr2g/C/R7YSi3EFTKCmh7Bp5W1UH64D/O

2)将上述参数按照参数名(上面参数中的Region、ProjectId等)进行升序排序

Action:GetUIoTCoreDeviceShadow
DeviceSN:ark1d4ug1evfb1jy
ProductSN:8pi2i730vxsala2a
ProjectId:org-z44lmf12e
PublicKey:CJf+LfjjXPk70z/fsBlK9sHC+kBTTj7gr2g/C/R7YSi3EFTKCmh7Bp5W1UH64D/O
Region:cn-sh2

3)将上述参数的键值依次相连构造字符串,并在尾部接上用户私钥

  • 用户私钥通过 个人中心→API密钥获取为:ztqlj0vtg6Por5d/etqpadpTZwscLRh5cIsFAHbwuvnMY4mAWI+GT5C2yzj/KiZf
  • 拼接获得字符串为(键值依次相连+用户私钥):

ActionGetUIoTCoreDeviceShadowDeviceSNark1d4ug1evfb1jyProductSN8pi2i730vxsala2aProjectIdorg-z44lmf12ePublicKeyCJf+LfjjXPk70z/fsBlK9sHC+kBTTj7gr2g/C/R7YSi3EFTKCmh7Bp5W1UH64D/ORegioncn-sh2ztqlj0vtg6Por5d/etqpadpTZwscLRh5cIsFAHbwuvnMY4mAWI+GT5C2yzj/KiZf

4)计算SHA1签名

将第3)步字符串进行SHA1签名,获取签名串为

Signature:f1e6b4e35df41b42232e059f6020c7fd51b2889e

5)至此所有请求需要的参数

Action:GetUIoTCoreDeviceShadow
DeviceSN:ark1d4ug1evfb1jy
ProductSN:8pi2i730vxsala2a
ProjectId:org-z44lmf12e
PublicKey:CJf+LfjjXPk70z/fsBlK9sHC+kBTTj7gr2g/C/R7YSi3EFTKCmh7Bp5W1UH64D/O
Region:cn-sh2
Signature:f1e6b4e35df41b42232e059f6020c7fd51b2889e

5. 请求接口获取响应

通过GET和POST都可以请求接口得到同样的响应结果,请求的BaseURL为http://api.ucloud.cn/

1)通过GET方式

① 当参数中存在特殊字符时需要进行编码,编码的规则为:

  • 字符 A~Z、a~z、0~9不编码;
  • 字符“-”、“_”、“.”、“~”不编码;
  • 其它字符编码成 %XY 的格式,其中 XY 是字符对应 ASCII 码的 16 进制表示。比如:英文的双引号(”)对应的编码为 %22;
  • 对于扩展的 UTF-8 字符,编码成 %XY%ZA… 的格式;
  • 英文空格( )要编码成 %20,而不是加号(+)。

根据上述的规则将

PublicKey:CJf+LfjjXPk70z/fsBlK9sHC+kBTTj7gr2g/C/R7YSi3EFTKCmh7Bp5W1UH64D/O

进行URL编码为

PublicKey:CJf%2BLfjjXPk70z%2FfsBlK9sHC%2BkBTTj7gr2g%2FC%2FR7YSi3EFTKCmh7Bp5W1UH64D%2FO

② 将请求参数转换成URL Params,拼接上Base URL进行GET请求:

http(s)://api.ucloud.cn/?Action=GetUIoTCoreDeviceShadow&DeviceSN=ark1d4ug1evfb1jy&ProductSN=8pi2i730vxsala2a&ProjectId=org-z44lmf12e&PublicKey=CJf%2BLfjjXPk70z%2FfsBlK9sHC%2BkBTTj7gr2g%2FC%2FR7YSi3EFTKCmh7Bp5W1UH64D%2FO& Region=cn-sh2&Signature=f1e6b4e35df41b42232e059f6020c7fd51b2889e

③ 返回响应结果为:

{
 "Action": "GetUIoTCoreDeviceShadowResponse",
 "RetCode": 0,
 "Payload": {
     "State": {
         "Reported": {},
         "Desired": {}
     },
     "Metadata": {
         "Reported": {},
         "Desired": {}
     }
 },
 "Version": 2,
 "Timestamp": 1561011300
}

2)通过POST方式

① POST通过JSON格式请求:

POST  HTTP/1.1
Host: api.ucloud.cn
Content-Type: application/json
Body:
{
	"Action": "GetUIoTCoreDeviceShadow",
	"DeviceSN": "ark1d4ug1evfb1jy",
	"ProductSN": "8pi2i730vxsala2a",
	"ProjectId": "org-z44lmf12e",
	"PublicKey": "CJf+LfjjXPk70z/fsBlK9sHC+kBTTj7gr2g/C/R7YSi3EFTK   Cmh7Bp5W1UH64D/O",
	"Region": "cn-sh2",
	"Signature": "f1e6b4e35df41b42232e059f6020c7fd51b2889e"
}

②返回响应结果为:

{
 "Action": "GetUIoTCoreDeviceShadowResponse",
 "RetCode": 0,
 "Payload": {
     "State": {
         "Reported": {},
         "Desired": {}
     },
     "Metadata": {
         "Reported": {},
         "Desired": {}
     }
 },
 "Version": 2,
 "Timestamp": 1561011300
}

常见问题

  • 当使用GET请求有特殊字符未编码时会出现:
{
  "Message": "User Not Exists",
  "RetCode": 172
}
  • 当签名出错,或者排序出错时会出现:
{
  "Message": "Signature VerifyAC Error",
  "RetCode": 171
}