通用说明
API 服务域名
DDC API 的服务域名包括:
| Region | EndPoint | Protocol |
|---|---|---|
| 北京 | ddc.bj.baidubce.com | HTTP and HTTPS |
| 保定 | ddc.bd.baidubce.com | HTTP and HTTPS |
| 苏州 | ddc.su.baidubce.com | HTTP and HTTPS |
| 武汉 | ddc.fwh.baidubce.com | HTTP and HTTPS |
通信协议
API 调用遵循 HTTP 协议,各 Region 采用不同的域名,具体域名为 ddc.{region}.baidubce.com。 数据交换格式为 JSON,所有 request/response body 内容均采用 UTF-8 编码。
请求参数
请求参数包括如下4种:
| 参数类型 | 说明 |
|---|---|
| URI | 通常用于指明操作实体,如:POST /v{version}/ddc/instance/{instanceId} |
| Query参数 | URL中携带的请求参数 |
| HEADER | 通过HTTP头域传入,如:x-bce-date |
| Request Body | 通过JSON格式组织的请求数据体 |
公共头
公共请求头
| 参数名称 | 描述 |
|---|---|
| Authorization | 包含Access Key与请求签名。 |
| Content-Type | application/json; charset=utf-8。 |
| x-bce-date | 表示日期的字符串,符合 API 规范。 |
| Host | 表示请求 API 的域名。 |
| x-bce-content-sha256 | 表示内容部分的SHA256签名的十六进制字符串。 这里内容指HTTP Request Payload Body。 即 Content 部分在被 HTTP encode之前的原始数据。 |
HTTP协议的标准头域不再这里列出。公共头域将在每个云数据库 DDC API 中出现,是必需的头域,其中x-bce-content-sha256头域只出现在POST和PUT请求中。POST、PUT、DELETE等请求数据放在request body中。
公共响应头
| 参数名称 | 描述 |
|---|---|
| Content-Type | application/json; charset=utf-8。 |
| x-bce-request-id | 云数据库 RDS 后端生成,并自动设置到响应头域中。 |
返回值
正确返回结果
DDC服务要求使用JSON格式的结构体来描述一个请求返回的具体内容。作为示例,以下是一个正确的返回结果格式:
1HTTP/1.1 200 OK
2x-bce-request-id: 1214cca7-4ad5-451d-9215-71cb844c0a50
3Date: Wed, 03 Dec 2014 06:42:19 GMT
4Content-Type: application/json;charset=UTF-8
5{
6 "id": 231683837451
7}
错误返回结果
请求发生错误时通过respone body返回详细错误信息,遵循如下格式:
| 参数名 | 类型 | 说明 |
|---|---|---|
| code | String | 错误码 |
| message | String | 错误描述 |
| requestId | String | 本次请求的 requestId |
示例:
1{
2 "requestId" : "ae2225f7-1c2e-427a-a1ad-5413b762957d",
3 "code" : "AccessDenied",
4 "message" : "Access denied."
5}
API 版本号
| 参数 | 类型 | 参数位置 | 描述 | 是否必须 |
|---|---|---|---|---|
| version | string | URL参数 | API版本号,当前API版本为v1 | 是 |
认证机制
所有API的安全认证一律采用Access Key与请求签名机制。 Access Key由Access Key ID和Secret Access Key组成,均为字符串。 对于每个HTTP请求,使用下面所描述的算法生成一个认证字符串。提交认证字符串放在Authorization头域里。服务端根据生成算法验证认证字符串的正确性。 认证字符串的格式为bce-auth-v{version}/{accessKeyId}/{timestamp}/{expirationPeriodInSeconds}/{signedHeaders}/{signature}。
- version是正整数。
- timestamp是生成签名时的UTC时间。
- expirationPeriodInSeconds表示签名有效期限。
- signedHeaders是签名算法中涉及到的头域列表。头域名之间用分号(;)分隔,如host;x-bce-date。列表按照字典序排列。(本API签名仅使用host和x-bce-date两个header)
- signature是256位签名的十六进制表示,由64个小写字母组成。
当百度智能云接收到用户的请求后,系统将使用相同的SK和同样的认证机制生成认证字符串,并与用户请求中包含的认证字符串进行比对。如果认证字符串相同,系统认为用户拥有指定的操作权限,并执行相关操作;如果认证字符串不同,系统将忽略该操作并返回错误码。
鉴权认证机制的详细内容请参见 鉴权认证。
密码加密传输规范定义
所有涉及密码的接口参数都需要加密,禁止明文传输。密码一律采用AES-128-ECB加密算法进行加密,用SK的前16位作为密钥,用PKCS5Padding算法进行长度补全。此外,加密后生成的二进制字节流需要转成十六进制,并以字符串的形式传到服务端。
加密过程可参考以下代码,以Python为例,进行说明:
1# -*- coding: utf-8 -*-
2
3from Crypto.Cipher import AES
4from binascii import b2a_hex, a2b_hex
5"""
6若引入包Cipher后提示不存在该包,则安装pycryptodome包
7"""
8
9def encrypt(secretkey, password):
10 """Encrypt adminpass by AES-128-ECB/PKCS5Padding, the key is secretkey."""
11 pendding = 16 - len(password) % 16
12 password += chr(pendding) * (pendding)
13 return b2a_hex(AES.new(secretkey[:16], AES.MODE_ECB).encrypt(password))
14
15def decrypt(secretkey, password):
16 """Decrypt adminpass by AES-128-ECB/PKCS5Padding, the key is secretkey."""
17 decrypted = AES.new(secretkey[:16], AES.MODE_ECB).decrypt(a2b_hex(password))
18 pendding = ord(decrypted[len(decrypted) - 1])
19 return decrypted[:-pendding]
幂等性
当调用创建接口时如果遇到了请求超时或服务器内部错误,用户可能会尝试重发请求,这时用户通过clientToken参数避免创建出比预期要多的资源,即保证请求的幂等性。
幂等性基于clientToken,clientToken是一个长度不超过64位的ASCII字符串,通常放在query string里,如http://ddc.bj.baidubce.com/v1/ddc/ob/instance?clientToken=be31b98c-5e41-4838-9830-9be700de5a20。
如果用户使用同一个clientToken值调用创建接口,则服务端会返回相同的请求结果。因此用户在遇到错误进行重试的时候,可以通过提供相同的clientToken值,来确保只创建一个资源;如果用户提供了一个已经使用过的clientToken,但其他请求参数(包括queryString和requestBody)不同甚至url Path不同,则会返回IdempotentParameterMismatch的错误代码。
clientToken的有效期为24小时,以服务端最后一次收到该clientToken为准。也就是说,如果客户端不断发送同一个clientToken,那么该clientToken将长期有效。
使用 DDC API 的用户需要实名认证,没有通过实名认证的可以前往百度开放云官网控制台中的安全认证下的实名认证中进行认证。 没有通过实名认证的用户请求将会得到一下错误提示码:
| 错误码 | 错误描述 | HTTP状态码 | 中文解释 |
|---|---|---|---|
| QualifyNotPass | The User has not pass qualify. | 403 | 账号没有通过实名认证 |
日期与时间规范
日期与时间的表示有多种方式。为统一起见,除非是约定俗成或者有相应规范的,凡需要日期时间表示的地方一律采用UTC时间,遵循ISO 8601,并做以下约束:
表示日期一律采用YYYY-MM-DD方式,例如2014-06-01表示2014年6月1日 表示时间一律采用hh:mm:ss方式,并在最后加一个大写字母Z表示UTC时间。例如23:00:10Z表示UTC时间23点0分10秒。 凡涉及日期和时间合并表示时,在两者中间加大写字母T,例如2014-06-01T23:00:10Z表示UTC时间2014年6月1日23点0分10秒。
排版约定
| 排版格式 | 含义 |
|---|---|
| < > | 变量 |
| [ ] | 可选项 |
| { } | 必选项 |
| | | 互斥关系 |
| 等宽字体 Courier New | 屏幕输出 |
评价此篇文章
