[任務]
用筋斗雲框架建立乙個web介面專案叫mysvc,建立資料庫,提供對apilog物件的操作介面。
git clone mysvc
如果github訪問困難,也可以用這個git倉庫:
配置好web伺服器,php環境和mysql資料庫。
注意php最低版本需要5.4版本,需要開啟mysql, pdo, gd等支援。
在web伺服器上將專案下的介面主目錄(即server目錄)暴露出來,假設url是:
http://localhost/mysvc/
http://localhost/mysvc/tool/init.php
這個工具會先檢查執行環境是否正確,如有異常(比如php版本不對,缺少元件等)請先解決。
然後建立介面應用使用的資料庫和配置檔案。
初始化工具執行完後,生成的配置檔案為php/conf.user.php
,之後也可以手工編輯該檔案。
資料模型定義在主設計文件design.wiki中,作為示例,裡面定義了一些資料模型,像使用者(user),訂單(ordr)以及前面提過的操作日誌(apilog)等,還定義了一些常用介面,如登入操作(login)等。
我們通過通過命令列工具tool/upgrade.php可以建立或更新資料庫:
cd tool
php upgrade.php
(這時進入upgrade互動操作,輸入initdb命令建立或更新資料庫)
> initdb
(輸入命令q退出)
> q
我們進入server目錄看看:
class
ac_apilog
extends
accesscontrol
這一句**就提供了對apilog物件的標準增刪改查(crud)介面如下:
查詢物件列表,支援分頁、查詢條件、統計等:
apilog.query() -> table(id, tm, addr)
新增物件,通過post引數傳遞字段值,返回新物件的id
apilog.add()(tm, addr) -> id
獲取物件
apilog.get(id) ->
更新物件,通過post引數傳遞字段值。
apilog.set(id)(tm?, addr?)
刪除物件
apilog.del(id)
[介面原型的描述方式]
在上面的介面原型描述中,用了兩個括號的比如add/set操作,表示第乙個括號中的引數通過get引數(也叫url引數)傳遞,第二個括號中的引數用post引數(也叫form引數)傳遞。
多數介面引數支援用get方式或post方式傳遞,除非在介面說明中特別指定。
帶」?」表示引數或返回的屬性是可選項,可以不存在。
介面原型中只描述呼叫成功時返回資料的資料結構,完整的返回格式是[0, 返回資料]
;而在呼叫失敗時,統一返回[非0錯誤碼, 錯誤資訊]
。
我們可以直接用curl工具來模擬前端呼叫,用add介面新增一行資料,使用http post請求:
curl http://localhost/mysvc/api.php/apilog.add -d "tm=2016-9-9 10:10" -d "addr=shanghai"
[0,11338]
0表示呼叫成功,後面是成功時返回的資料,add操作返回物件id,可供get/set/del操作使用。
用get介面取出這個物件出來看看:
curl http://localhost/mysvc/api.php/apilog.get?id=11338
輸出:
[0,]
這裡引數id是通過url傳遞的。
前面說過,未顯式說明時,介面的引數可以通過url或post引數方式來傳遞,所以本例中url引數id也可以通過post引數來傳遞:
curl http://localhost/mysvc/api.php/apilog.get -d "id=11338"
如果取乙個不存在的物件,會得到錯誤碼和錯誤資訊,比如:
curl http://localhost/mysvc/api.php/apilog.get?id=999999
輸出:
[1,"引數不正確"]
再用set介面做乙個更新,按介面要求,要將id引數放在url中,要更新的字段及值用post引數:
curl http://localhost/mysvc/api.php/apilog.set?id=11338 -d "addr=beijing"
輸出:
[0, "ok"]
再看很靈活的query介面,取下列表,預設支援分頁,會輸出乙個nextkey欄位:
curl http://localhost/mysvc/api.php/apilog.query
返回示例:
[0,]
返回的格式稱為壓縮表,」h」為表頭字段,」d」為表的資料,在介面描述中用table(id, 其它欄位...)
表示。
預設返回的json資料未經美化,效率較高,如果想看的清楚些,可以在配置檔案conf.user.php中設定測試模式:
putenv("p_test_mode=1");
curl http://localhost/mysvc/api.php/apilog.query?_debug=9
這在除錯sql語句時很有用。此外,測試模式還會開放某些內部介面,以及預設允許跨域訪問,便於通過web頁面測試介面。注意線上生產環境絕不可設定為測試模式。
query介面也支援常用的陣列返回,需要加上_fmt=list
引數:
curl http://localhost/mysvc/api.php/apilog.query -d "_fmt=list"
返回示例:
[0,,
, ...
],"nextkey":11349
}]
curl "http://localhost/mysvc/api.php/apilog.query?_pagekey=11349&_pagesz=5"
不僅支援分頁,query介面非常靈活,可以指定返回字段、查詢條件、排序方式,
比如查詢2023年1月份的資料(cond引數),結果只需返回id, addr欄位(res引數,也可用於get介面),按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"
甚至可以做統計,比如檢視2023年1月裡,列出訪問次數排名前10的位址,以及每個位址訪問了多少次伺服器,也可以通過query介面直接查出。
做乙個按addr欄位的分組統計(gres引數):
curl http://localhost/mysvc/api.php/apilog.query -d "gres=addr" -d "res=count(*) cnt" -d "cond=tm>='2016-1-1' and tm<'2016-2-1'" -d "orderby=cnt desc" -d "_pagesz=10"
輸出示例:
[0,]
[介面呼叫的描述方式]
在之後的示例中,我們將使用介面原型來描述乙個呼叫,不再使用curl,比如上面的呼叫將表示成:
apilog.query(gres=addr
res="count(*) cnt"
cond="tm>'2016-1-1' and tm<'2016-2-1'"
orderby="cnt desc"
_pagesz=10
)->
返回資料如非特別宣告,我們將只討論呼叫成功時返回的部分,比如說返回」ok」實際上表示返回[0, "ok"]
。 筋斗雲介面程式設計
隨著移動網際網路的快速發展,各行業對手機應用開發需求旺盛。應用開發一般分為前端和後端,後端關注資料和業務,需要對前端各類應用 如安卓應用 蘋果應用 h5應用等 提供基於http協議的互動介面。筋斗雲使用php語言開發的,實現了 分布式物件訪問與許可權控制架構 daca 中的規約,提供的http介面符...
筋斗雲介面程式設計 常用操作(一)
函式mparam用來取必傳引數 m表示mandatory 引數既可以用url引數,也可以用post引數傳遞。如果是取乙個可選引數,可以用param函式。與直接用php的 get等變數相比,param mparam可指定引數型別,如 取id引數,特別地,對id引數會返回乙個整數。id param id...
筋斗雲介面程式設計 常用操作(二)
函式應返回符合介面原型中描述的物件,框架會將其轉為最終的json字串。比如登入介面要求返回 因而在api login中,返回結構相符的物件即可 ret id id,isnew 1 return ret 最終返回的json示例 0,如果介面原型中沒有定義返回值,框架會自動返回字串 ok 比如介面api...