OpenAPI的请求结构如下:
服务地址
参考 1.2.1 确认URL。
通信协议
支持通过 HTTP 或 HTTPS 两种方式进行请求通信,推荐使用安全性更高的 HTTPS方式发送请求。
请求方法
请求方法详见各个接口具体的需求。OpenAPI大多数支持GET或POST请求。
请求参数
OpenAPI请求包含两类参数:公共请求参数和接口请求参数。其中公共请求参数在每个请求中都必须包含。接口请求参数需参考各个服务的接口文档。
字符编码
请求及返回结果使用UTF-8的字符集进行编码。
所有接口请求中都必须携带公共参数,为了避免重复说明,产品的API文档中可能不再重复描述这部分参数,请您在请求API时携带这部分参数,否则请求将无法通过合法性验证。
公共参数如下:
说明
注: ApiAction 与 ApiVersion 必须放到 query 中
名称 | 类型 | 是否必填 | 参数格式 | 描述 | 示例值 |
---|---|---|---|---|---|
ApiAction | String | 是 | [a-zA-Z]+ | 接口名称。实际调用时请参考您使用的产品的API文档取值 | CreateUser |
ApiVersion | String | 是 | YYYY-MM-DD | 接口的版本。 实际调用时请参考您使用的产品的API文档取值。 | 2023-02-10 |
说明
注:签名参数放在 header 中
名称 | 类型 | 是否必填 | 描述 | 示例值 |
---|---|---|---|---|
X-Date | String | 是 | 使用UTC时间,精确到秒,使用遵循ISO 8601标准的格式: | 20201103T104027Z |
Authorization | String | 是 | HMAC-SHA256 Credential={AccessKeyId}/{ShortDate}/{Region}/{Service}/request, SignedHeaders={SignedHeaders}, Signature={Signature} | HMAC-SHA256 Credential=AKLTMjI2ODVlYzI3ZGY1NGU4ZjhjYWRjMTlmNTM5OTZkYzE/20201230/cn/open_platform/request, SignedHeaders=content-type;x-date, Signature=28eeabbbd726b87002e0fe58ad8c1c768e619b06e2646f35b6ad7ed029a6d8a7 |
Authorization中的信息含义:
名称 | 类型 | 备注 |
---|---|---|
AccessKeyId | String | 请求的Access Key ID。 |
ShortDate | String | 请求的短时间,精确到日。使用UTC时间,请使用格式:YYYYMMDD, 例如:20180201 |
Region | String | 请求的地域例如cn,当您使用的产品按Region提供服务时,该参数值请填写您实际要访问的Region。当使用非Region服务类产品,可以填写“cn” |
Service | String | 请求的服务,此处填写open_platform |
SignedHeaders | String | 参与签名的Header,多个Header间用分号分隔。目的是指明哪些header参与签名计算 |
Signature | String | 计算完毕的签名。 |
此处介绍上文签名参数的生成机制。具体为两个字段的生成机制即Credential和SignedHeaders,这两个字段合并成authorization。
几个简写:
Hash代指SHA256算法
HexEncode代指转16进制编码
Hmac指代Hmac_SHA256
CanonicalRequest = HTTPRequestMethod + '\n' + CanonicalURI + '\n' + CanonicalQueryString + '\n' + CanonicalHeaders + '\n' + SignedHeaders + '\n' + HexEncode(Hash(RequestPayload))
其中每个字段的含义如下:
=
连接,按照排序结果将“参数对”用&
连接。CanonicalQueryString = "ApiAction=ListUsers&ApiVersion=2018-01-01"
签名字符串主要包含请求以及正规化请求的元数据信息,由签名算法、请求日期、信任状和正规化请求哈希值连接组成,伪代码如下:
StringToSign = Algorithm + '\n' + RequestDate + '\n' + CredentialScope + '\n' + HexEncode(Hash(CanonicalRequest))
在计算签名前,首先从私有访问密钥(secret Access Key)派生出签名密钥(signing key),而不是直接使用私有访问密钥。具体计算过程如下:
kSecret = *Your Secret Access Key* kDate = HMAC(kSecret, Date) kRegion = HMAC(kDate, Region) kService = HMAC(kRegion, Service) kSigning = HMAC(kService, "request")
其中Date精确到日,与RequestDate中YYYYMMDD部分相同。
Signature = HexEncode(HMAC(kSigning, StringToSign))
然后构建header
Authorization: HMAC-SHA256 Credential={AccessKeyId}/{CredentialScope}, SignedHeaders={SignedHeaders}, Signature={Signature}
表达式中用{}括起来的代表上文计算出的中间过程。
ak/sk获取
私部环境
签名示例
以这个调用为例:
AK:BDPPee313bdff6ef33555d6c5c1e7b8152aa
SK:75e089c0f77268a20f0ce78d97eea0f
GET https://e0-0-220cdp.datarangers-onpremise.volces.com/open_platform/openapi?ApiAction=ListUsers&ApiVersion=2023-02-10&Limit=10&Offset=0 HTTP/1.1 Host: e0-0-220cdp.datarangers-onpremise.volces.com Content-Type: application/x-www-form-urlencoded; charset=utf-8 X-Content-Sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 X-Date:20201230T081805Z
说明: header: X-Content-Sha256 表示对请求中的二进制的body进行SHA-256 哈希。 如果是Get请求,则对[]byte{} 进行sha256 哈希,哈希值是"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
规范请求
CanonicalRequest = HTTPRequestMethod + '\n' + CanonicalURI + '\n' + CanonicalQueryString + '\n' + CanonicalHeaders + '\n' + SignedHeaders + '\n' + HexEncode(Hash(RequestPayload))
GET
/open_platform/openapi
ApiAction=ListUser&ApiVersion=2023-02-10&Limit=10&Offset=0
将需要参与签名的header的key全部转成小写, 然后以ASCII排序后以key-value的方式组合后换行构建。
x-date:20230313T051101Z // 多一个换行
x-date
无论是GET请求还是POST请求都有RequestPayload,其中此请求中的RequestPayload是空字符串。
这里的hash算法代指:sha256 []byte
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
GET /open_platform/openapi ApiAction=ListUser&ApiVersion=2023-02-10&Limit=10&Offset=0 x-date:20230313T051101Z x-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
待签字符串
StringToSign = Algorithm + '\n' + RequestDate + '\n' + CredentialScope + '\n' + HexEncode(Hash(CanonicalRequest))
目前是一个固定的字符串
HMAC-SHA256
请求发起的时间, 与X-Date相同。
20230313T051101Z
指代信任状,格式为:YYYYMMDD/region/service/request
此请求信息如下:
20230313/cn/open_platform/request
933cfa461d6630a796a773a9e3ef13489bdf12fe4ad1a99ee724634b2b6a9ee6
HMAC-SHA256 20230313T051101Z 20230313/cn/open_platform/request 933cfa461d6630a796a773a9e3ef13489bdf12fe4ad1a99ee724634b2b6a9ee6
签名
HMAC这里代指HMAC-SHA256
HMAC(HMAC(HMAC(HMAC(kSecret,"20230313"),"cn"),"open_platform"),"request")
以下示例显示了此 HMAC 哈希操作序列生成的派生签名密钥。这说明了此二进制签名密钥中每个字节的十六进制表示形式。
b40d8e9b81c28d8494218b3c7ddb07155345ec33bf858b2026b6bb335eb6de58
signature = HexEncode(HMAC(Signingkey, StringToSign))
最终的结果如下:
c808c9fce0d830df36b957e8797fc58728c0209f41193d21f6e117d1b6932dc9
将签名添加到请求当中
在请求中增加Authorization的header如下:
Authorization: HMAC-SHA256 Credential={AccessKeyId}/{CredentialScope}, SignedHeaders={SignedHeaders}, Signature={Signature}
完整结果如下:
Authorization: HMAC-SHA256 Credential=BDPPee313bdff6ef33555d6c5c1e7b8152aa/20230313/cn/open_platform/request, SignedHeaders=x-date, Signature=c808c9fce0d830df36b957e8797fc58728c0209f41193d21f6e117d1b6932dc9
CDP 提供了Java, Golang语言的SDK, SDK的使用参见下文 6. SDK使用。
名称 | 数据类型 | 描述 |
---|---|---|
data | Object | 返回数据内容 |
msg | String | 请求出现错误,返回错误信息 |
code | Int | 返回错误码(全局常用错误码表见公共错误码) |
说明
接口调用中 X-Tenant、tenantCode、tenantId、appId、projectId 均为项目ID,代表相同含义,仅参数名称不同,获取方式见附录中的租户code获取方式。