阿里妹导读:由于每个网关所对应的后端情况不同,因此没有一套元数据可以适用于所有的网关。阿里云通过重新定义一门 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 IDconfig.accessKeyId = accessKeyId;// 您的可用区IDconfig.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 解决一个轻量场景,或是满足一个小功能,通通到碗里来!现报名通道火热开启!
点击“阅读原文”,立即报名吧~