阿里妹导读:由于每个网关所对应的后端情况不同,因此没有一套元数据可以适用于所有的网关。阿里云通过重新定义一门 DSL 语言 —— Darabonba 来支持不同风格的 OpenAPI,同时支持多语言的 SDK、Code Sample 目标生成。本文将从技术原理和解决方案分享相关的探索和实践。
文末推荐:OpenAPI 开发者挑战赛。
云产品 OpenAPI 没有提供 SDK 或者 SDK 语言不全;
部分云产品的 SDK 使用风格差异过大,导致使用成本增加;
API 文档缺失或者不够清晰,不具备指导意义;
没有场景化 Code Sample 或提供 CodeSample 无法运行。
客户使用或者开发者接入核心库的 SDK 开发者来说成本会越来越大;
核心库的维护人员的维护成本也会越来越高,随着方法越来越多也需要不断的对核心库进行重构,遇到不兼容性改动的可能性也会越来越高;
所有方法杂糅在一个核心库中,在修改时容易牵一发动全身,需要大量的测试用例保障。
/**
* Console val with log level into stdout
* @param val the printing string
* @return void
* @example \[LOG\] tea console example
*/
static function log(val: string): void;
import Console;
static async function main(args: [ string ]) throws : void {
Console.log("hello world!");
}
import Dyvmsapi;
import RPC;
import Console;
/**
* 使用AK&SK初始化账号Client
* @param accessKeyId
* @param accessKeySecret
* @param regionId
* @return Client
* @throws Exception
*/
static function createClient (accessKeyId : string , accessKeySecret : string) throws : Dyvmsapi{
var config = new RPC.Config{};
// 您的AccessKey ID
config.accessKeyId = accessKeyId;
// 您的可用区ID
config.accessKeySecret = accessKeySecret;
return new Dyvmsapi(config);
}
/**
* @param args
* @throws Exception
*/
static async function main(args: [string]) throws : void {
var client = createClient("accessKeyId","accessKeySecret");
var request = new Dyvmsapi.QueryCallDetailByCallIdRequest{
// 通话的唯一识别ID。
callId = "100625930001^10019107xx",
// 产品ID。
// 11000000300006:语音通知。
// 11010000138001:语音验证码。
// 11000000300005:语音IVR。
// 11000000300004:语音双呼。
// 11000000300009:语音SIP。
// 11030000180001:智能外呼。
prodId = 11000000300004L,
// 指定通话发生的时间,格式为Unix时间戳,单位毫秒。会查询这个时间点对应的一整天的记录。queryDate = 1577255564
};
var response = client.queryCallDetailByCallId(request);
Console.log(response.code);
}
需要大量的人力去维护 Test Cases ,而且无法保障所有语言的 SDK 都拥有 Test Cases;
OpenAPI 的 Test Cases 少且更新频率低,造成了对 OpenAPI 的覆盖面低而无法起到有效的保障作用;
各语言 SDK 的由各语言的开发同学分别维护,所以用例不同步导致不同语言之间的测试结果有所差异。
import Assert;
import Dyvmsapi;
import RPC;
static function createClient (accessKeyId : string , accessKeySecret : string) throws : Dyvmsapi{
var config = new RPC.Config{};
config.accessKeyId = accessKeyId;
config.accessKeySecret = accessKeySecret;
return new Dyvmsapi(config);
}
static async function TestNumberEqual() throws : void {
var client = createClient("accessKeyId","accessKeySecret");
var request = new Dyvmsapi.QueryCallDetailByCallIdRequest{
callId = "100625930001^10019107xx",
prodId = 11000000300004L,
queryDate = 1577255564
};
var response = client.queryCallDetailByCallId(request);
Assert.equal(response.code, 'OK', 'queryCallDetailByCallId is failed!');
}
参与其他语言生成器的生成,目前 Darabonba 只支持了比较常用的六门语言,还需要更多生成器的支持。
编写更多底层工具模块,使 Darabonba 能够生成更便捷的 SDK。
参与 Darabonba 编译器及 CLI 工具的建设中来。
编写更多 OpenAPI 元数据转换到 Darabonba 的工具。
相关阅读
[1]Darabonba 上手文档 https://github.com/aliyun/darabonba#%E6%96%87%E6%A1%A3 [2]Darabonba CodeSample 示例 https://darabonba.api.aliyun.com/tutorial/demos [3]Darabonba:支持任意 OpenAPI 网关的多语言 SDK 方案
快来参加
OpenAPI 开发者挑战赛
阿里云开放平台携手开发者社区、内容设计部,联合举办“OpenAPI 开发者挑战赛第三期 —— CodeSample 全民赛码”,面向数万开发者,招募阿里云 OpenAPI 示例代码。无论您是入门开发,或是运维大神,无论是利用 OpenAPI 解决一个轻量场景,或是满足一个小功能,通通到碗里来!现报名通道火热开启!
点击“阅读原文”,立即报名吧~