调用说明
一、概述
百度智能云的 DRCDN 的 API 接口域名 http://cdn.baidubce.com ,所有接口统一使用 /v2 前缀,接口规范遵循 BCE 标准,采用HTTP协议通信,支持 HTTP 1.0/1.1 。支持 HTTP 的 PUT、POST、GET、DELETE 请求方法。
二、通用约定
1、编码及数据格式
数据交换格式使用 JSON 格式,Content-Type 为 applicaton/json 样式,所有 request/response body 内容均使用 UTF-8 编码。
2、日期与时间
日期与时间的表示有多种方式。为统一起见,除非是约定俗成或者有相应规范的,凡是 HTTP 标准中规定的表示日期和时间字段用 GMT ,其他日期时间表示的地方一律采用 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 秒。
API 与时间相关的数值类型统一采用上述格式,称为 Timestamp 类型。
3、规范化字符串
通常一个字符串中可以包含任何 Unicode 字符。在编程中这种灵活性会带来不少困扰。因此引入“规范字符串”的概念。一个规范字符串只包含百分号编码字符以及 URI(Uniform Resource Identifier)非保留字符(Unreserved Characters)。 RFC 3986 规定 URI 非保留字符包括以下字符:字母(A-Z,a-z)、数字(0-9)、连字号(-)、点号(.)、下划线(_)、波浪线(~)。 将任意一个字符串转换为规范字符串的方式是:
- 将字符串转换成 UTF-8 编码的字节流。
- 保留所有 URI 非保留字符原样不变。
- 对其余字节做一次 RFC 3986 中规定的百分号编码(Percent-Encoding),即一个 % 后面跟着两个表示该字节值的十六进制字母。字母一律采用大写形式。
示例:
原字符串:
this is an example for 测试对应的规范字符串:this%20is%20an%20example%20for%20%E6%B5%8B%E8%AF%95
在请求时,需要对 Querystring 的 Value 做 UrlEncode ,如下所示:
1public static String uri-encode(CharSequence input, boolean encodeSlash) {
2 StringBuilder result = new StringBuilder()
3 for (int i = 0; i < input.length(); i++) {
4 char ch = input.charAt(i);
5 if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9') || ch == '_' || ch == '-' || ch == '~' || ch == '.') {
6 result.append(ch)
7 } else if (ch == '/') {
8 result.append(encodeSlash ? "%2F" : ch)
9 } else {
10 result.append(toHexUTF8(ch))
11 }
12 }
13 return result.toString()
14}
4、编码规范
- 可解析内容,所有 request/response body 内容目前均使用 UTF-8 编码,后续会支持更多 encoding 类型。
- 在请求时,需要对 QueryString 的 Value 做 UrlEncode 。
三、签名认证(自行封装)
API 服务会对每个访问的请求进行身份认证,以保障用户的安全。安全认证采用 Access Key 与请求签名机制。Access Key 由 Access Key ID(简称 AK )和 Secret Access Key(简称 SK )组成,均为字符串,由百度智能云官方颁发给用户。其中 Access Key ID 用于标识用户身份,Secret Access Key 是用于加密签名字符串和服务器端验证签名字符串的密钥,必须严格保密。
1、签名字符串格式
1bce-auth-v{version}/{accessKeyId}/{timestamp}/{expireTime}/{signedHeaders}/{signature}
2、签名申请步骤
关于 AK/SK 的获取,请参看 获取 AK/SK。
3、签名生成算法
百度智能云采用统一的API鉴权认证机制,详情请见 鉴权认证机制。
四、签名认证(使用 SDK ,推荐方式)
我们推荐您直接使用签名的 SDK 来计算签名鉴权,然后基于 API 接口文档来集成接口功能。
以 Python SDK 为例,详见:Python SDK 推荐的使用方式
五、公共头
1、公共请求头域
API 服务需要在请求的 HTTP 头域中包含以下信息:
| 头域(Header) | 说明 | 是否必须 |
|---|---|---|
| host | http host | 是 |
| Authorization | 包含 Access Key 与请求签名 | 是 |
| x-bce-date | 该请求创建的时间,表示日期一律采用 YYYY-MM-DD 方式,例如 2014-06-01 表示 2014 年 6 月 1 日。如果用户使用了标准的 Date 域,该头域可以不填。当两者同时存在时,以 x-bce-date 为准。 | 否 |
| x-bce-content-sha256 | 表示内容部分的 SHA256 签名的十六进制字符串,其中内容指 HTTP Request Payload Body ,即 Content 部分在被 HTTP encode 之前的原始数据。 | 否 |
| x-bce-request-id | 用来跟踪调试的 Id ,为一个 uuid 字符 | 否 |
2、公共响应头域
| 头域(Header) | 说明 |
|---|---|
| x-bce-request-id | 对应请求的 requestId |
| Content-Type | application/json,charset=utf-8。一期编码只支持 utf-8 ,所以 charset 是固定的。 |
六、错误信息格式
API 的错误信息除了 HTTP 状态码以外,在 HTTP body 中还包 JSON 格式的错误信息,内容如下:
| 参数名 | 类型 | 说明 |
|---|---|---|
| requestId | String | 导致该错误的 requestId |
| code | String | 表示具体错误类型 |
| message | String | 有关该错误的详细说明 |
例如:
1{
2 "code":"IllegalRequestUrl",
3 "message":"The requested url belongs to domain which is not under acceleration",
4 "requestId":" 81d0b05f-5ad4-1f22-8068-d5c9de60a1d7"
5}
七、通用错误码
除了后面各个接口单独列出的错误格式定义以外,API 的通用错误码还包含但不限于以下形式:
| HTTP Status Code | Code | Message | 说明 |
|---|---|---|---|
| 400 | InvalidArgument | Invalid Argument. | 无效参数 |
| 400 | InvalidHTTPAuthHeader | The HTTP authorization header is invalid. Consult the service documentation for details. | Authorization 头域格式错误 |
| 400 | InvalidHTTPRequest | There was an error in the body of your HTTP request. | HTTP body 格式错误。例如不符合指定的 Encoding 等 |
| 400 | MalformedJSON | The JSON you provided was not well-formed. | JSON 格式不合法 |
| 403 | SignatureDoesNotMatch | The request signature we calculated does not match the signature you provided. Check your Secret Access Key and signing method. Consult the service documentation for details. | Authorization 头域中附带的签名和服务端验证不一致 |
| 403 | InvalidAccessKeyId | The Access Key ID you provided does not exist in our records. | Access Key ID 不存在 |
| 405 | MethodNotAllowed | he specified method is not allowed against this resource. | 请求的方法不允许 |
| 500 | InternalError | We encountered an internal error. Please try again. | 未定义的系统错误 |
八、省份、运营商格式
| 地区 | 映射 | 运营商 | 映射 |
|---|---|---|---|
| 北京 | beijing | 电信 | ct |
| 天津 | tianjin | 联通 | cnc |
| 河北 | hebei | 移动 | cmnet |
| 内蒙古 | nmg | 教育网 | ce |
| 山西 | shanxi | 鹏博士 | pbs |
| 上海 | shanghai | 广电 | oc |
| 安徽 | anhui | 世纪互联 | sjhl |
| 江苏 | jiangsu | 方正宽带 | fdbn |
| 浙江 | zhejiang | 华数 | wasu |
| 山东 | shandong | 其他 | other |
| 福建 | fujian | ||
| 江西 | jiangxi | ||
| 广东 | guangdong | ||
| 广西 | guangxi | ||
| 海南 | hainan | ||
| 河南 | henan | ||
| 湖北 | hubei | ||
| 湖南 | hunan | ||
| 黑龙江 | hlj | ||
| 吉林 | jilin | ||
| 辽宁 | liaoning | ||
| 陕西 | shaanxi | ||
| 甘肃 | gansu | ||
| 宁夏 | ningxia | ||
| 青海 | qinghai | ||
| 新疆 | xinjiang | ||
| 重庆 | chongqing | ||
| 四川 | sichuan | ||
| 云南 | yunnan | ||
| 贵州 | guizhou | ||
| 西藏 | xizang | ||
| 海外 | oversea | ||
| 其他 | other |
