批量請求

天笑發表於2017-03-21

批量請求

筋斗雲框架支援批量請求,即在一次請求中,包含多條介面呼叫。

假設一個前端頁面進入時,需要接連呼叫好多次介面才能完成展現,一般的做法是需要後端重新設計介面來優化。 筋斗雲支援batch介面,這時後端不必做任何設計修改,前端只要呼叫batch介面即可獲得優化。

假如前端進入某頁面,需要呼叫下面兩個介面:

獲取使用者資訊
User.get() -> {id, name, phone, ...}

上傳使用者操作日誌
ActionLog.add()(page, ver, userId) -> id

批處理允許把兩個請求一次性提交,減少互動帶來的開銷。

如果前端H5應用使用了筋斗雲前端框架,可以非常方便的啟動/禁用批處理操作,只需要在多次呼叫前加一行useBatchCall,就可將多次呼叫合併成一次批呼叫:

MUI.useBatchCall(); // 在本次訊息迴圈中執行所有的callSvr都加入批處理。
// MUI.useBatchCall({useTrans:1}); // 啟用事務的寫法

// 呼叫一
var param = {res: "id,name,phone"};
callSvr("User.get", param, function(data) {} )

// 呼叫二
var postParam = {page: "home", ver: "android", userId: "{$1.id}"};
callSvr("ActionLog.add", function(data) {}, postParam, {ref: ["userId"]} );

其原理是使用batch介面,在POST內容中設定每個呼叫,請求示例如下:

POST /mysvc/api.php/batch

[
    {
        "ac": "User.get",
        "get": {"res": "name,phone"}
    },
    {
        "ac": "ActionLog.add",
        "post": {"page": "home", "ver": "android", "userId": "{$-1.id}"},
        "ref": ["userId"]
    }
]

POST內容的格式是一個JSON陣列,陣列中每一項為一個呼叫宣告,引數有ac, get, post, ref等, 只有ac引數必須,其它均可省略。

引數
- get: URL請求引數。
- post: POST請求引數。
- ref: 使用了batch引用的引數列表。

後面的請求還可以引用前面請求返回的內容作為引數。例子中,呼叫二中引數userId引用了呼叫一的返回結果,userId的值"{$1.id}"表示取第一次呼叫值的id屬性。 注意:引用表示式應以"{}"包起來,"$n"中n可以為正數或負數(但不能為0),表示對第n次或前n次呼叫結果的引用,以下為可能的格式:

"{$1}"
"id={$1.id}"
"{$-1.d[0][0]}"
"id in ({$1}, {$2})"
"diff={$-2 - $-1}"

花括號中的內容將用計算後的結果替換。如果表示式非法,將使用"null"值替代。

在建立批量請求時,可以指定這些呼叫是否在一個事務(transaction)中,一起成功提交或失敗回滾。 如果想讓這批請求在一個事務中處理,只需要增加URL引數useTrans=1

POST /mysvc/api.php/batch?useTrans=1

batch的返回內容是多條呼叫返回內容組成的陣列,樣例如下:

[0, [
    [ 0, {id: 1, name: "使用者1", phone: "13712345678"} ],  // 呼叫User.get的返回結果
    [ 0, "OK" ]  // 呼叫ActionLog.add的返回結果
]]

相關文章