调用说明
请求结构
请求结构简介
API服务域名
云数据库 VDB API 的服务域名包括:
Region | EndPoint | Protocol |
---|---|---|
北京 | vdb.bj.baidubce.com | HTTP and HTTPS |
保定 | vdb.bd.baidubce.com | HTTP and HTTPS |
苏州 | vdb.su.baidubce.com | HTTP and HTTPS |
广州 | vdb.gz.baidubce.com | HTTP and HTTPS |
通信协议
API 调用遵循 HTTP 协议,各 Region 采用不同的域名具体域名为 vdb.{region}.baidubce.com。
请求参数
百度智能云 API 的每个请求都需要指定两类参数:即公共请求参数以及接口请求参数。其中公共请求参数是每个接口都要用到的请求参数,而接口请求参数是各个接口所特有的,具体见各个接口的“请求参数”描述。
请求参数包括如下4种:
参数类型 | 参数说明 |
---|---|
URI | 通常用于指明操作实体,如:POST /v{version}/instance/{instanceId} |
Query参数 | URL中携带的请求参数 |
HEADER | 通过HTTP头域传入,如:x-bce-date |
RequestBody | 通过JSON格式组织的请求数据体 |
API版本号
参数 | 类型 | 参数位置 | 描述 | 是否必须 |
---|---|---|---|---|
version | Integer | URL参数 | API版本号 | 是 |
字符编码
可解析内容,所有 request/response body 内容目前均使用 UTF-8 编码
公共头
公共请求头
参数名称 | 描述 |
---|---|
Authorization | 请求签名 |
Content-Type | application/json;charset=utf-8 |
x-bce-date | 表示日期的字符串,符合 API 规范。 |
Host | 表示请求API的域名 |
HTTP协议的标准头域不在这里列出。公共头域将在每个云数据库 VDB API 中出现
公共响应头
参数名称 | 描述 |
---|---|
x-bce-request-id | 请求ID,云数据库 VDB 后端生成,并自动设置到响应头域中 |
Content-Type | application/json;charset=utf-8 |
最终请求形式
请求
最终的请求由以下几部分组成:
- 请求域名: 如北京区域的域名为vdb.bj.baidubce.com。
- 请求路径: 各个接口请求路径不同,详见具体接口详情。
- 请求方式: 支持RESTful风格的请求方式,本接口文档中涉及POST,GET,PUT,DELETE四种方式。
- 请求头: 包括鉴权信息在内的各个公共请求头。详细参考公共头。
- 最终请求参数串: 包括接口路径参数(请求路径中问号后面的部分)和接口请求参数。如删除实例的路径参数instanceId=vdb-bj-xxxxxxx和接口请求参数clientToken={clientToken}。
- 请求body体:根据接口规定的RequestBody参数结构组成的json结构体。
示例:
POST /v1/vdb/instance/create
Content-Type: application/json
x-bce-content-sha256: fc2af5fb07f6acdf3981dfe4f02d23a3585e93f618b81876abee98ed268cf
x-bce-date: 2023-01-01T08:33:37Z
Authorization: bce-auth-v1/d2f57e2b0b1611e89c59c56590fe827b/2023-01-01T08:33:37Z/3600/host;x-bce-account;x-bce-client-ip;x-bce-date;x-bce-request-id;x-bce-security-token/fc2af5fb07f6704f118641f75ea4f02d23a3585e93f618b81876f5d210fb8be4
{
"productType": "postpay",
"instanceParam": {
"appType": "cluster",
"instanceName":"vdb",
"availabilityZone":"cn-bj-c",
"subnetId":"sbn-xdfdssdf",
"vpcId":"vpc-xdfsdfsd",
"dataNodeNum":2,
"proxyNum":2,
"instanceNum":1,
"nodeSpec":"vdb.dc.large",
"azInfos":[{"availabilityZone":"cn-bj-c","subnetId":"sbn-xdfsdfsd"}],
"diskFlavor":20,
"port":80,
"nodeType": "compute",
"diskType": "ssd",
"password": "aIO6HYjJymeHfOk+kh1ej1poAj0M2QoQcA57vsfmZX0sOx1JqvxfJdpHYyb/3jEPiKbim0g2xzDhwEk3rd9t50rA9oQu3CuoB6xV96LuR+GLxg6wh0ledRsKrThmg5/Y4sDvQyKbWyajaG1+yktfQr+wbVMEyhc13vl/vXIiElw="
},
"duration": 1,
"autoRenew": true,
"autoRenewTimeUnit": "month",
"autoRenewTime": 1
}
正确返回结果
云数据库 VDB 的API 服务要求使用JSON格式的结构体来描述一个请求返回的具体内容。作为示例,以下是一个正确的返回结果格式:
HTTP/1.1 200 OK
x-bce-request-id: 1214cca7-4ad5-451d-9215-71cb844c0a50
Date: Wed, 03 Dec 2014 06:42:19 GMT
Content-Type: application/json;charset=UTF-8
Server: BWS
{
"orderId":"3075e812-6f88-11ed-b24d-7cd30adefcf4",
instanceIdList: [
"vdb-bj-xxxxxxxx"
]
}
错误返回结果
请求发生错误时通过respone body返回详细错误信息,遵循如下格式:
参数名 | 类型 | 说明 |
---|---|---|
code | String | 错误码 |
message | String | 错误描述 |
requestId | String | 本次请求ID |
示例:
{
"requestId" : "ae2225f7-1c2e-427a-a1ad-5413b762957d",
"code" : "AccessDenied",
"message" : "Access denied."
}
云数据库 VDB 错误返回码说明
错误码 | HTTP状态码 | 说明 |
---|---|---|
Unauthorized | 400 | 签名异常 |
HttpRequestMethodNotSupported | 405 | 请求方法不支持 |
OperationDenied | 403 | 禁止操作 |
InternalServerError | 500 | 服务内部错误 |
InstanceNotExist | 404 | 实例不存在 |
DecryptionPassErr | 400 | 密码异常 |
InstanceStatusErr | 400 | 实例状态异常 |
ReleaseInstanceErr | 400 | 释放实例异常 |
NotEnoughBalanceForPayOrder | 400 | 余额不足 |
VdbServerErr | 500 | VDB内部服务异常 |
ResourceInTask | 400 | 资源存在未完成的订单 |
BillingServiceErr | 500 | 订单异常 |
BceValidationException | 400 | 参数校验错误 |
ResourceStatusUnexpect | 400 | 资源状态异常 |
PasswordInvalid | 400 | 密码错误 |
签名认证
所有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为例,进行说明:
# -*- coding: utf-8 -*-
from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex
"""
若引入包Cipher后提示不存在该包,则安装pycryptodome包
"""
def encrypt(secretkey, password):
"""Encrypt adminpass by AES-128-ECB/PKCS5Padding, the key is secretkey."""
pendding = 16 - len(password) % 16
password += chr(pendding) * (pendding)
return b2a_hex(AES.new(secretkey[:16], AES.MODE_ECB).encrypt(password))
def decrypt(secretkey, password):
"""Decrypt adminpass by AES-128-ECB/PKCS5Padding, the key is secretkey."""
decrypted = AES.new(secretkey[:16], AES.MODE_ECB).decrypt(a2b_hex(password))
pendding = ord(decrypted[len(decrypted) - 1])
return decrypted[:-pendding]
幂等性
当调用创建接口时如果遇到了请求超时或服务器内部错误,用户可能会尝试重发请求,这时用户通过 clientToken 参数避免创建出比预期要多的资源,即保证请求的幂等性。 幂等性基于 clientToken,clientToken 是一个长度不超过 64 位的 ASCII 字符串,通常放在 query string 里,如http://vdb.bj.baidubce.com/v1/instance?clientToken=be31b98c-5e41-4838-9830-9be700de5a20。 如果用户使用同一个 clientToken 值调用创建接口,则服务端会返回相同的请求结果。因此用户在遇到错误进行重试的时候,可以通过提供相同的 clientToken 值,来确保只创建一个资源;如果用户提供了一个已经使用过的 clientToken,但其他请求参数(包括 queryString 和 requestBody)不同甚至 url Path 不同,则会返回 IdempotentParameterMismatch 的错误代码。 clientToken 的有效期为 24 小时,以服务端最后一次收到该 clientToken 为准。也就是说,如果客户端不断发送同一个 clientToken,那么该 clientToken 将长期有效。
日期与时间规范
日期与时间的表示有多种方式。为统一起见,除非是约定俗成或者有相应规范的,凡需要日期时间表示的地方一律采用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秒。