需求描述

进行复杂项目开发时,服务端(数据接口实现端)会把接口拆分的比较细粒度,以方便在更多地方复用。而拆分后的接口在前端进行组合请求时,通常会出现一个区块要请求5、6个接口甚至更多接口请求才能拿到想要的数据,过多的数据请求会导致区块渲染较慢,移动端表现尤为明显。
为了改善这种情况,也有在服务端再开发一些新接口来进行combine前端需要用的接口,不过开发和维护都不是很好,我们应该把这个过程自动化掉

思路

类比cdn文件combine的思路,前端在请求时对接口动态combine,后端有一个专门处理combine接口的服务接口。我们在这个过程中约定好前后端的数据格式即可

约定

假设我们要请求如下2个接口

接口:
users/list
参数:
status=1
name=xl 接口:
users/role
参数:
id=20

我们假设客户端对上述2个接口combine后发送如下格式的请求到服务端

接口
api/combine
参数
apis=[{
url:'users/list',
body:{
status:1,
name:xl
}
},{
url:'users/role',
body:{
id:20
}
}]

服务端实现一个固定的api/combine接口,接收到上述数据后,内部再去请求相应的接口,拿到数据后返回如下的数据格式

{
'users/list':{data:{},ok:true},
'users/role':{data:{},ok:true}
}

在Magix中的应用

var Service = Magix.Service.extend(function(bag, callback) {
var bags = bag.get('bags', []); //启用接口combine后,所有的请求都会走combine,Magix内部会把要请求的bag对象放到bags数组内
var data = [];
for (var i = 0; i < bags.length; i++) {
var params = bags[i].get('params'); //单个接口要发送给服务端的数据
data.push({
url: bags[i].get('url'),
body: params
});
}
$.ajax({
url: 'api/combine',
data: 'apis=' + JSON.stringify(data),
dataType: 'json',
type:'post',
success: function(responseData) {
for (var i = 0; i < bags.length; i++) {//拆分统一返回的数据
var url = bags[i].get('url');
var d = responseData[url];//根据url读取相应的数据
if (d) {
bags[i].set('data', d);//设置数据
}
}
callback();
}
});
}); Service.add([{
name: 'list',
url: 'users/list',
cache: 100000
}, {
name: 'role',
url: 'users/role'
}]);

使用

var s1 = new Service();
s1.all('list', function(err, list) {
console.log(err, list);
});
setTimeout(function() {
var s = new Service(); s.all(['list', 'role'], function(err, list, role) {
console.log(err, list, role);
});
}, 6000);

兼容之前的所有功能及cache,该功能需要后端根据约定配合,约定并非要按照前面描述的规则,可以自己定义,只需要在Magix.Service.extend中自己处理好即可

Magix是一个区块化管理框架:https://github.com/thx/magix/...
项目地址:https://github.com/thx/magix
欢迎star与fork

接口combine的更多相关文章

  1. C#进阶系列——WebApi 接口返回值不困惑:返回值类型详解

    前言:已经有一个月没写点什么了,感觉心里空落落的.今天再来篇干货,想要学习Webapi的园友们速速动起来,跟着博主一起来学习吧.之前分享过一篇 C#进阶系列——WebApi接口传参不再困惑:传参详解  ...

  2. webapi+Task并行请求不同接口实例

    标题的名称定义不知道是否准确,不过我想表达的意思就是使用Task特性来同时请求多个不同的接口,然后合并数据:我想这种场景的开发对于对接过其他公司接口的人不会陌生,本人也是列属于之内,更多的是使用最原始 ...

  3. xv6课本翻译之——第0章 操作系统接口

    Chapter 0 第0章 Operating system interfaces 操作系统接口 The job of an operating system is to share a comput ...

  4. 关于MapReduce中自定义Combine类(一)

    MRJobConfig      public static fina COMBINE_CLASS_ATTR      属性COMBINE_CLASS_ATTR = "mapreduce.j ...

  5. Web Api 与 Andriod 接口对接开发经验

    最近一直急着在负责弄Asp.Net Web Api 与 Andriod 接口开发的对接工作! 刚听说要用Asp.Net Web Api去跟 Andriod 那端做接口对接工作,自己也是第一次接触Web ...

  6. [Asp.net 5] Configuration-新一代的配置文件(接口定义与基础实现)

    关于配置文件的目录:[Asp.net 5] Configuration-新一代的配置文件 本系列文章讲的是asp.net 5(Asp.net VNext)中的配置文件部分,工程下载地址为:https: ...

  7. Winform调用百度地图接口

    using System; using System.IO; using System.Collections.Generic; using System.ComponentModel; using ...

  8. 让SpringMVC支持可版本管理的Restful接口

    需求 移动互联网时代的到来,软件开发的模式也在变化.记得以前做B/S的后台开发,基本上没有Http接口一说,全部是通过渲染模板技术(jsp,freemark)把最终html展示给最终用户.现在完全变了 ...

  9. 那些年,我们开发的接口之:QQ登录(OAuth2.0)

    那些年,我们开发的接口之:QQ登录(OAuth2.0) 吴剑 2013-06-14 原创文章,转载必须注明出处:http://www.cnblogs.com/wu-jian 前言 开发这些年,做过很多 ...

随机推荐

  1. ubuntu 下的ftp安装及root身份远程配置

    第一步:在 Ubuntu 中安装 VSFTPD 服务器 //安装 VSFTPD 二进制包 $ sudo apt-get update $ sudo apt-get install vsftpd //使 ...

  2. SqlServer 取表某一列相同ID最大时的数据

    SELECT * FROM(SELECT *,ROW_NUMBER() OVER(PARTITION BY UserName ORDER BY Id DESC) Num FROM dbo.[User] ...

  3. JZ-063-数据流中的中位数

    数据流中的中位数 题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两 ...

  4. 简单聊一聊Javascript中的模块化

    在面试中只要说到模块化的问题,多多少少总会问到这些,umd.amd.cjs.esm,可能听过其中一个两个,或者都听说过.接下来我们先简单了解一下他们到底是什么,又有什么样的区别呢. 最开始的时候,Ja ...

  5. php简易表单及下拉框动态渲染

    <?php//1.连接数据库$link = mysqli_connect('127.0.0.1','root','root','1906');//2.设置字符集mysqli_set_charse ...

  6. php 23种设计模型 - 访问者模式

    访问者模式是一种行为型模式,访问者表示一个作用于某对象结构中各元素的操作.它可以在不修改各元素类的前提下定义作用于这些元素的新操作,即动态的增加具体访问者角色. 访问者模式利用了双重分派.先将访问者传 ...

  7. SP1480题解

    <四重计树法> 有标号无根 prufer 序列,\(n^{n-2}\). 有标号有根 prufer 序列,\(n^{n-1}\). 无标号有根 设 \(f[n]\) 为 \(n\) 个节点 ...

  8. [动态规划] 适合DJ银行的日子

    [动态规划] 适合DJ银行的日子 前言:开始的时候用常规模拟做的超时了,然后看官方题解,大致意思就是连续n天单调可以用动态规划的思想 你和一群强盗准备打劫银行.给你一个下标从 0 开始的整数数组 se ...

  9. 笔记软件-Obsidian(相关资料分享)

    Obsidian(黑曜石) 是一个功能强大的知识管理软件,是一款功能强大的带有关系图谱功能的双向链笔记,它可基于纯文本Markdown文件的本地文件夹上运行 Obsidian是一个支持markdown ...

  10. 1354:括弧匹配检验ybt

    [题目描述]假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,如([ ]())或[([ ][ ])]等为正确的匹配,[( ])或([ ]( )或 ( ( ) ) )均为错误的匹配. 现在 ...