批量请求

筋斗云框架支持批量请求,即在一次请求中,包含多条接口调用。

假设一个前端页面进入时,需要接连调用好多次接口才能完成展现,一般的做法是需要后端重新设计接口来优化。 筋斗云支持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的返回结果
]]

评论

本文目前还没有评论……

我要评论

需要登录后才能发言
登录未成功,请修改提交。