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

posted on 2018-11-06 10:06  荣锋亮  阅读(572)  评论(0编辑  收藏  举报

导航