ballerina 学习 三十 扩展开发(一)
ballerina 主要是分为两大类
- 基于ballerina 语言开发的,一般是客户端的connector
- 使用java语言开发的(类似的基于jvm的都可以),一般是注解以及进行构件生成
ballerina 语言开发说明
- 是一个ballerian 的包
- 创建一个对象包含了init 、getCallerActions 函数
- 实现init 函数,次函数是在用户实例化一个endpoint的时候
- 实现getCallerActions 函数,次函数是在connect 必须别返回的时候进行调用
- 构建模块并发布
一个twilio connector 使用说明
官方提供了单文件以及多文件的代码组织方式,各有优缺点,结合实际使用
- 使用demo(注意官方文档的版本有问题,最好参考github 学习)
import ballerina/config;
import ballerina/io;
import wso2/twilio;
public function main(string... args) {
endpoint twilio:Client twilioClient {
accountSId:config:getAsString("ACCOUNT_SID"),
authToken:config:getAsString("AUTH_TOKEN"),
xAuthyKey:config:getAsString("AUTHY_API_KEY")
};
var details = twilioClient->getAccountDetails();
match details {
twilio:Account account => io:println(account);
twilio:TwilioError twilioError => io:println(twilioError);
}
}
twilio connector 开发细节说明
按照流程开发即可
- 是一个模块
我们可以使用ballerina init 创建
- 一个对象包含了init 、getCallerActions 函数
因为其他地方需要调用,我们的可见性,使用public 修饰
endpoint:
public type TwilioClient object {
// 配置参数
public TwilioConfiguration twilioConfig;
public TwilioConnector twilioConnector = new;
// init 函数
public function init(TwilioConfiguration config);
documentation { Initialize Twilio endpoint
R{{}} The Twilio connector object
}
// getCallerActions 函数
public function getCallerActions() returns TwilioConnector;
};
配置说明:
public type TwilioConfiguration record {
http:ClientEndpointConfig clientConfig;
};
- connector 对象,实际上就是具体干活的对象
public type TwilioConnector object {
public string accountSId;
public http:Client client;
public function getAccountDetails() returns Account|error;
};
- 常量以及record 定义
public type Account record {
string sid;
string name;
string status;
string ^"type";
string createdDate;
string updatedDate;
};
// Constants
@final string BASE_URL = "https://api.twilio.com/2010-04-01";
@final string ACCOUNTS_API = "/Accounts/";
@final string RESPONSE_TYPE_JSON = ".json";
@final string EMPTY_STRING = "";
- 实现endpoint 的init 、getCallerActions 函数
function TwilioClient::getCallerActions() returns TwilioConnector {
return self.twilioConnector;
}
function TwilioClient::init(TwilioConfiguration config) {
config.clientConfig.url = BASE_URL;
string username;
string password;
var usernameOrEmpty = config.clientConfig.auth.username;
match usernameOrEmpty {
string usernameString => username = usernameString;
() => {
error err = { message: "Username cannot be empty" };
throw err;
}
}
var passwordOrEmpty = config.clientConfig.auth.password;
match passwordOrEmpty {
string passwordString => password = passwordString;
() => {
error err = { message: "Password cannot be empty" };
throw err;
}
}
self.twilioConnector.accountSId = username;
self.twilioConnector.client.init(config.clientConfig);
}
- 实现connector 函数
function TwilioConnector::getAccountDetails() returns Account|error {
endpoint http:Client httpClient = self.client;
string requestPath = ACCOUNTS_API + self.accountSId + RESPONSE_TYPE_JSON;
var response = httpClient->get(requestPath);
json jsonResponse = check parseResponseToJson(response);
return mapJsonToAccount(jsonResponse);
}
参考资料
https://ballerina.io/learn/how-to-extend-ballerina/(文档与项目不一致)
https://github.com/wso2-ballerina/module-twilio