API-Reference
概览
对象 | 方法 |
---|---|
Workflow(工作流) | CreateWorkflow, PutWorkflow, GetWorkflow, DeleteWorkflow, ActivateWorkflow, ListWorkflow, GetExecutableWorkflow, ListExecutableWorkflow |
Task(任务) | ListTask, GetTask, StopTask, DeleteTask, ListJob , GetJob |
Tool (工具) | CreateTool, PutTool, DeleteTool, ListTool, GetTool, GetToolParameterTemplate, GetToolDetails |
服务入口
GeneDock服务入口是访问GeneDock资源的URL,与Project所在的区域(Region)有关,目前GeneDock已经有两个Region,在各Region内的公网服务入口如下:
北京域:cn-beijing-api.genedock.com
深圳域:cn-shenzhen-api.genedock.com
当用户访问某个具体的Project时,需要根据Project名称及其所在的Region组合出最终访问地址。具体格式如下:
<region>:<account-name>:<project-name>
在现阶段,GeneDock还不支持创建多个Project,用户默认只有一个以default的Project。
例如访问账户为default的项目空间default,所在区域为深圳,则对应访问地址如下:
cn-shenzhen-api.genedock.com/accounts/default/projects/default/
访问密钥
访问密钥是GeneDock为用户使用API来访问GeneDock资源设计的”安全口令”。你可以用它来签名API请求内容以通过服务端的安全验证。该访问秘钥成对(AccessKeyId与AccessKeySecret)生成和使用。由于访问秘钥是GeneDock对API请求进行安全验证的关键因子,请妥善保管你的访问秘钥。如果秘钥对出现泄漏风险,建议及时删除该秘钥对并生成新的替代秘钥对。
公共请求头
GeneDock API是基于HTTP协议的REST风格接口,它支持一组可以在所有API请求中使用的公共请求头(是否必选请仔细阅读相关说明。),其详细定义如下:
Header名称 | 类型 | 说明 |
---|---|---|
Accept | 字符串 | 客户端希望服务端返回的类型,支持json。仅对GET请求有效,具体取值以各个接口定义为准。 可选。 |
Accept-Encoding | 字符串 | 客户端希望服务端返回的压缩算法,例如gzip,具体取值以接口定义为准。 可选。 |
Authorization | 字符串 | 签名内容,细节参考请求签名部分。必选。 |
Content-Language | 字符串 | 请求Body所采用的自然语言。可选。 |
Content-Length | 字符串 | HTTP请求Body长度。 可选。 |
Content-MD5 | 字符串 | 请求Body经过MD5计算后的字符串,计算结果为大写。可选。 |
Content-Type | 字符串 | HTTP请求Body类型。如果没有Body部分,则不需要提供该请求头,具体取值以各个接口定义为准。 可选。 |
Date | 字符串 | 当前发送时刻的时间,使用GMT标准时间。格式化字符串如下:%a, %d %b %Y %H:%M:%S GMT (如:Mon, 3 Jan 2010 08:33:47 GMT)。 必选。 |
Host | 字符串 | HTTP请求的完整HOST名字(不包括http或https这样的协议头),例如cn-shenzhen-api.genedock.com或cn-shenzhen-api.genedock.com:80。 可选。 |
x-gd-apiversion | 字符串 | API版本号, 默认为最新版本。 本次版本为1.0。 可选。 |
x-gd-bodyrawsize | 数值 | 请求的Body原始大小。当无Body时该字段为0,当Body是压缩数据,则为压缩前的原始数据大小。可选。 |
x-gd-compresstype | 字符串 | API请求中Body部分使用压缩算法,如果不压缩,可以不提供该请求头。可选。 |
x-gd-date | 字符串 | 当前发送时刻的时间,格式与Date一直。如果请求中包含改公共请求头,它的值会取代Date标准头的值用于服务器请求验证。无论是否有x-gd-date,HTTP标准Date头都必须提供。可选。 |
x-gd-signaturemethod | 字符串 | 签名计算方法,以实现为准。 默认值为hmac-sha1-v1。 可选。 |
说明:
请求中Date所表示的时间与服务器接收到该请求的时间最大可接受误差为15分钟,如果超过15分钟服务器端会拒绝该请求。如果请求中设置了x-gd-date头部,则该时间误差计算基于x-gd-date头的值。
如果请求指明压缩算法(在x-gd-compresstype中指定),则需要把原始数据压缩后放到HTTP Body部分,而对应的Content-Length、Content-MD5头部也是按照压缩后的Body部分计算。
由于某些平台上发送HTTP请求时无法指定Date头(由平台自身的库内部自动指定为发送当前时间),造成无法使用正确的Date值计算请求签名。在这种情况下,请指定x-gd-date头并用该请求头的值参与请求签名计算。GeneDock服务端在接受到API请求后会首先判断是否有x-gd-date头,如果有则用它的值来做签名验证,否则就用HTTP的标准头Date做签名验证。
公共响应头
GeneDock API是基于HTTP协议的REST风格接口。所有的API响应都提供一组公共响应头,其详细定义如下:
Header名称 | 类型 | 说明 |
---|---|---|
x-gd-requestid | 字符串 | 服务端产生的标示该请求的唯一ID。主要用于跟踪和调查问题。例如用户希望调查出现问题的API请求,可以提供该ID |
Content-Length | 数值 | HTTP响应内容长度 |
Content-MD5 | 字符串 | HTTP响应内容的MD5值 |
Content-Type | 字符串 | HTTP相应内容类型,例如json |
Date | 字符串 | 当前返回时刻的时间,使用GMT标准格式。格式化字符串如下:%a, %d %b %Y %H:%M:%S GMT (如:Mon, 3 Jan 2010 08:33:47 GMT)。 |
请求签名
为了保证用户数据的安全,GeneDock API的所有HTTP请求都必须经过安全验证。目前,该安全验证基于GeneDock访问密钥,使用对称加密算法完成的。其工作流程如下:
- 请求端根据API请求内容(包括HTTP Header和Body)生成签名字符串;
- 请求端使用GeneDock的访问密钥对(AccessKeyID和AccessKeySecret)对第一步生成的签名字符串进行签名,形成该API请求的数字签名;
- 请求端把API请求内容和数字签名一起发给服务端;
- 服务端在接到请求后会重复第一、二两步工作并在服务端计算出该请求期望的数字签名;(注:服务端会在后台取得该请求使用的用户访问密钥对)
- 服务端用期望的数字签名和请求端发送过来的数字签名做对比,如果一致则认为该请求通过安全验证,否则拒绝该请求。
通过上述安全验证流程,我们可以达到以下目的: - 确认是谁在做API请求:发送请求前需要用户指定生成数字签名的密钥对,在服务端可通过该密钥对确定用户身份,进而可做访问权限管理。
- 确认用户请求在网络传输过程中有没有被篡改:服务端会对接收到的请求内容重新计算数字签名,一旦请求内容在网络上被篡改,则无法通过数字签名比对。
签名API请求
用户可以在HTTP请求中增加Authorization(授权)的Head来包含签名(Signature)信息,表明这个消息已被授权。
Authorization字段计算的方法
"Authorization: GeneDock " + AccessKeyId + ":" + Signature
Signature = base64(hmac-sha1(AccessKeySecret,
VERB + "\n"
+ Content-MD5 + "\n"
+ Content-Type + "\n"
+ Date + "\n"
+ CanonicalizedGDHeaders
+ CanonicalizedResource))
AccessKeySecret表示签名所需的密钥;
- VERB表示HTTP请求的方法名称,如PUT、GET等;
- Content-MD5表示请求内容数据的MD5值,详情参照RFC2616;
- Content-Type表示请求内容的类型;
- Date表示此次操作的时间,且必须为HTTP1.1中支持的GMT格式,内容为HTTP的Date请求头。如果存在x-gd-date,则以此头中所标识的时间为准;
- CanonicalizedGDHeaders表示以”x-gd-“为前缀的HTTP Header的组合;
- CanonicalizedResource表示用户想要访问的GeneDock服务的资源。
其中,Date和CanonicalizedResource不能为空;如果请求中Date所表示的时间与服务器接收到该请求的时间最大可接受误差为15分钟,如果超过15分钟服务器端会拒绝该请求。
构建CanonicalizedGDHeaders的方法
所有以”x-gd-“为前缀的HTTP Header被称为CanonicalizedGDHeaders。它的构建方法如下:
- 将所有以”x-gd-“为前缀的HTTP Header请求头的名字转换成小写字母,如”x-gd-Auth-Sign:Test”转换成”x-gd-auth-sign:Test”;
- 将上一步得到的所有HTTP 请求头按照名字的字典序进行升序排列;
- 如果有相同名字的请求头,则根据标准RFC2616 4.2章进行合并(两个值之间只用逗号分隔)。例如两个名为”x-gd-auth-sign”的请求头,对应的值分别为”Test”和”Alpha”,则合并后为”x-gd-auth-sign:Test,Alpha”;
- 删除请求头和内容之间分隔符两端出现的任何空格。如”x-gd-auth-sign: Test,Alpha”转换为”x-gd-auth-sign:Test,Alpha”;
- 将所有的头和内容用”\n”分隔符分隔拼成最后的CanonicalizedGDHeaders。
构建CanonicalizedRresource的方法
用户发送请求中想访问的GeneDock服务的目标资源被称为CanonicalizedRresource,它的构建方法如下:
- 将CanonicalizedRresource置为空字符串(“ “);
- 放入要访问的GeneDock服务资源,如”/datas/dataname”(无dataname则不填);
- 如请求包含查询字符串(QUERY_STRING),则在CanonicalizedRresource字符串尾部添加”?”和查询字符串。
其中QUERY_STRING是URL中请求参数按字典排序后的字符串,其中参数名和值之间用”=”(等号)相隔组成字符串,并对参数名-值对按照字典序升序排序,然后以”&”符号连接构成字符串。其公式化描述如下:
QUERY_STRING = "KEY1=VALUE1" + "&" + "KEY2=VALUE2"
请求签名示例
我们举例来演示整个过程,假设用户用作GeneDock API签名的访问密钥对如下:
AccessKeyId = "oHFcHbORoZCavj7GPtytUg=="
AccessKeySecret = "OldPPab5mqZWU4oHHaIbD9aCthB="
示例:
用户需要发送Get请求列出当前project下所有的task,其HTTP请求如下:
GET /tasks/ HTTP 1.1
Fri, 06 May 2016 09:12:23 GMT
Host: cn-shenzhen-api.genedock.com
x-gd-apiversion: 1.0
x-gd-signaturemethod: hmac-sha1-v1
如上GeneDock API请求生成的签名字符串为
GET\n\n\nFri, 06 May 2016 09:12:23 GMT\nx-gd-apiversion:1.0\nx-gd-signaturemethod:hmac-sha1-v1\n/tasks/?offset=1&size=100&taskid=56efe765c21f960013c0f7cf
由于是GET请求,该请求无任何HTTP Body,所以生成的签名字符串Content-Type与Content-MD5域为空字符串。那么以前面指定用户的AccessKeySecret做签名运算后得到的签名为:
qG656Uepw+U78ODJu7uYWVreSgk=
最后发送经过数字签名的请求内容如下:
GET /tasks/ HTTP 1.1
Fri, 06 May 2016 09:12:23 GMT
Host: cn-shenzhen-api.genedock.com
x-gd-apiversion: 1.0
x-gd-signaturemethod: hmac-sha1-v1
Authorization:GeneDock oHFcHbORoZCavj7GPtytUg==:qG656Uepw+U78ODJu7uYWVreSgk=
通用错误码
当API请求发生错误的时候,服务端会返回错误信息,包括HTTP的Status Code和响应Body的具体错误细节。其中响应Body中的错误细节格式如下:
{
"error_code": <ErrorCode>,
"error_message": <ErrorMessage>,
"error_message_chs": <错误信息>
}
HTTP状态码(status) | 错误码(Error Code) | 错误消息(Error Message) | 描述(Description) |
---|---|---|---|
400 | MissingAuthorization | Authorization field is empty or it does not exist. | Authorization字段为空或不存在。 |
400 | IllegalAuthorizationFormat | Authorization field value {value} is illegal. | 无效的Authorization格式。 |
400 | MissingDate | Date field is empty. | HTTP标准请求头Date为空或不存在。 |
400 | InvalidDateFormat | Date {value} format is invalid. | Date字段值格式无效。 |
400 | InvalidAccessKeyIdFormat | Invalid AccessKeyId format: {format}. | 无效的AccessKeyId格式。 |
401 | UnauthorizedAccessKey | The AccessKeyId is unauthorized. | 提供的AccessKeyId值未授权。 |
400 | InvalidSignatureMethod | Signature method {method} is not supported. | 不支持的签名方法。 |
403 | RequestTimeSkewed | Date within request has been expired. request time: {time} | 请求的发送时间超过当前服务处理时间前后15分钟的范围。 |
403 | SignatureNotMatch | Authorization signature is not correct, please verify AccessKeyId or AccessKeySecret. | Authorization签名不正确, 请检查AccessKeyId或AccessKeySecret。 |
403 | ContentMD5NotMatch | Content-MD5 does not match content md5. | 内容计算的MD5值与Content-MD5不一致。 |
400 | InvalidAPIVersion | Invalid API version: {version} | 无效API版本号。 |
400 | NotImplementedAPIVersion | NotImplemented API version: {version} | 未实现的API版本号。 |
404 | ProjectNotExists | Cannot find project: {project} | 无法找到项目。 |
401 | UnauthorizedResource | The credential is unauthorized to access the resource. | 所访问的资源未授权给当前身份。 |
403 | Forbidden | The credential is forbidden to access the resource. | 使用当前身份访问资源时被禁用。 |
500 | InternalServerError | Internal server error message. | 服务器内部错误。 |