筋斗雲接口編程

隨着移動互聯網的快速發展,各行業對手機應用開發需求旺盛。
應用開發一般分爲前端和後端,後端關注數據和業務,需要對前端各類應用(如安卓應用、蘋果應用、H5應用等)提供基於HTTP協議的交互接口。

筋斗雲是一個Web接口開發框架,它不講MVC,不做對象-數據表映射(OR Mapping),而是以數據表爲核心來開發Web Service(也稱爲Web API),提出極簡化開發的“數據模型即接口”思想。
它推崇以簡約的方式在設計文檔中描述數據模型及業務接口,進而自動創建或更新數據庫表以及業務接口,稱爲“一站式數據模型部署”。

筋斗雲使用php語言開發的,實現了“分佈式對象訪問與權限控制架構”(DACA)中的規約,提供的HTTP接口符合業務查詢協議(BQP)。

筋斗雲提供對象型接口和函數型接口兩類接口開發模式,前者專爲對象的增刪改查提供易用強大的編程框架,後者則更爲自由。

[對象型接口 - 數據模型即接口]

假設數據庫中已經建好一張記錄操作日誌的表叫”ApiLog”,包含字段id(主鍵,整數類型), tm(日期時間類型), addr(客戶端地址,字符串類型)。

使用筋斗雲後端框架,只要創建一個空的類,就可將這個表(或稱爲對象)通過HTTP接口暴露給前端,提供增刪改查各項功能:

class AC_ApiLog extends AccessControl
{
}

現在就已經可以對匿名訪問者提供”ApiLog.add”, “ApiLog.set”, “ApiLog.get”, “ApiLog.query”, “ApiLog.del”這些標準對象操作接口了。

我們用curl工具來模擬前端調用,假設服務接口地址爲http://localhost/mysvc/api.php,我們就可以調用”ApiLog.add”接口來添加數據:

curl http://localhost/mysvc/api.php/ApiLog.add -d "tm=2016-9-9 10:10" -d "addr=shanghai"

輸出一個JSON數組:

[0,11338]

0表示調用成功,後面是成功時返回的數據,add操作返回的是新對象的id。

可以調用”ApiLog.query”來取列表:

curl http://localhost/mysvc/api.php/ApiLog.query

列表支持分頁,默認一次返回20條數據。query接口非常靈活,還可以指定返回字段、查詢條件、排序方式,
比如查詢2016年1月份的數據(cond參數),結果只需返回id, addr字段(res參數),按id倒序排列(orderby參數):

curl http://localhost/mysvc/api.php/ApiLog.query -d "res=id,addr" -d "cond=tm>='2016-1-1' and tm<'2016-2-1'" -d "orderby=id desc"

甚至可以做統計,比如查看2016年1月裏,列出訪問次數排名前10的地址,以及每個地址訪問了多少次服務器,也可以通過query接口直接查出。

可見,用筋斗雲後端框架開發對象操作接口,可以用非常簡單的代碼實現強大而靈活的功能。

[函數型接口]

除了對象型接口,還有一類叫函數型接口,比如要實現一個接口叫”getInfo”用於返回一些信息,開發起來也非常容易,只要定義下面一個函數:

function api_getInfo()
{
    return ["name" => "jdcloud", "addr" => "Shanghai"];
}

於是便可以訪問接口”getInfo”:

curl http://localhost/mysvc/api.php/getInfo

返回:

[0, {"name": "jdcloud", "addr": "Shanghai"}]

[權限控制]

權限包括幾種,比如根據登錄類型不同,分爲用戶、員工、超級管理員等角色,每種角色可訪問的數據表、數據列(即字段)有所不同,一般稱爲授權(auth)。
授權控制不同角色的用戶可以訪問哪些對象或函數型接口,比如getInfo接口只許用戶登錄後訪問:

function api_getInfo()
{
    checkAuth(AUTH_USER); // 在應用配置中,已將AUTH_USER定義爲用戶權限,在用戶登錄後獲得
    ...
}

再如ApiLog對象接口只允許員工登錄後訪問,且限制爲只讀訪問(只允許get/query接口),不允許用戶或遊客訪問,只要定義:

// 不要定義AC_ApiLog,改爲AC2_ApiLog
class AC2_ApiLog extends AccessControl
{
    protected $allowedAc = ["get", "query"];
}

在應用配置中,已將類前綴”AC2”綁定到員工角色(AUTH_EMP),類似地,”AC”前綴表示遊客角色,”AC1”前綴表示用戶角色(AUTH_USER)。

通常權限還控制對同一個表中數據行的可見性,比如即使同是員工登錄,普通員工只能看自己的操作日誌,經理可以看到所有日誌。
這種數據行權限,也稱爲Data ownership,一般通過在查詢時追加限制條件來實現。假設已定義一個權限PERM_MGR,對應經理權限,然後實現權限控制:

class AC2_ApiLog extends AccessControl
{
    ...
    protected function onQuery()
    {
        if (! hasPerm(PERM_MGR)) {
            $empId = $_SESSION["empId"];
            $this->addCond("t0.empId={$empId}");
        }
    }
}

[一站式數據模型部署]

筋斗雲框架重視設計文檔,倡導在設計文檔中用簡約的方式定義數據模型與接口原型,
例如,上例中的ApiLog表,無需手工創建,只要設計文檔中定義:

@ApiLog: id, tm, addr

使用工具就可以自動創建數據表,由於數據模型即接口,也同時生成了相應的對象操作接口。
工具會根據字段的命名規則來確定字段類型,比如”id”結尾就用整型,”tm”結尾就用日期時間類型等。

當增加了表或字段,同樣運行工具,數據庫和後端接口也都會相應被更新。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章