title: 谈谈前后端的分工协作 categories:
+----------------+
| F2E |
+---↑--------↑---+
| |
+---↓--------↓---+
| Middle |
+---↑--------↑---+
| |
+---↓--------↓---+
| R2E |
+----------------+
<p>中间层的作用就是为了更好的控制数据的输出,如果用MVC模型去分析这个接口,R2E(后端)只负责 M(数据) 这部分,Middle(中间层)处理数据的呈现(包括 V 和 C)。淘宝UED有很多类似的文章,这里不赘述。</p>
<h3>二、核心问题</h3>
<p>上面提出了在业务中看到的常见的三种模式,问题的核心就是数据交给谁去处理。数据交给后台处理,这是模式一,数据交给前端处理,这是模式二,数据交给前端分层处理,这是模式三。三种模式没有优劣之分,其使用还是得看具体场景。</p>
<p>既然都是数据的问题,数据从哪里来?这个问题又回到了接口。</p>
<ul>
<li>接口文档由谁来撰写和维护?</li>
<li>接口信息的改动如何向前后端传递?</li>
<li>如何根据接口规范拿到前后端可用的测试数据?</li>
<li>使用哪种接口?JSON,JSONP?</li>
<li>JSONP 的安全性问题如何处理?</li>
</ul>
<p>这一系列的问题一直困扰着奋战在前线的前端工程师和后端开发者。淘宝团队做了两套接口文档的维护工具,IMS以及DIP,不知道有没有对外开放,两个东西都是基于 JSON Schema 的一个尝试,各有优劣。JSON Schema 是对 JSON 的一个规范,类似我们在数据库中创建表一样,对每个字段做一些限制,这里也是一样的原理,可以对字段进行描述,设置类型,限制字段属性等。</p>
<p>接口文档这个事情,使用 JSON Schema 可以自动化生产,所以只需编写 JSON Schema 而不存在维护问题,在写好的 Schema 中多加些限制性的参数,我们就可以直接根据 Schema 生成 mock(测试) 数据。</p>
<p>mock 数据的外部调用,这倒是很好处理:</p>typeof callback === "function" && callback({
json: "jsonContent"
})
<p>在请求的参数中加入 callback 参数,如 /mock/hashString?cb=callback,一般的 io(ajax) 库都对异步数据获取做了封装,我们在测试的时候使用 jsonp,回头上线,将 dataType 改成 json 就行了。</p>IO({
url: "http://barretlee.com",
dataType: "jsonp", //json
success: function(){}
})
<p>这里略微麻烦的是 POST 方法,jsonp 只能使用 get 方式插入 script 节点去请求数据,但是 POST,只能呵呵了。</p>
<p>这里的处理也有多重方式可以参考:</p>
<ul>
<li>修改 Hosts,让 mock 的域名指向开发域名</li>
<li>mock 设置 header 响应头,Access-Allow-Origin-Control</li>
</ul>
<p>对于如何拿到跨域的接口信息,我也给出几个参考方案:</p>
<ul>
<li>fiddler 替换包,好像是支持正则的,感兴趣的可以研究下(求分享研究结果,因为我没找到正则的设置位置)</li>
<li>使用 HTTPX 或者其他代理工具,原理和 fiddler 类似,不过可视化效果(体验)要好很多,毕竟人家是专门做代理用的。</li>
<li>自己写一段脚本代理,也就是本地开一个代理服务器,这里需要考虑端口的占用问题。其实我不推荐监听端口,一个比较不错的方案是本地请求全部指向一个脚本文件,然后脚本转发URL,如:
```
原始请求:http://barretlee.com/api/test.json
在ajax请求的时候:
$.ajax({
url: "http://<local>/api.php?path=/api/text.json"
});
```
</local>
<p>php中处理就比较简单啦:</p>if(!isset($_GET["page"])){
echo 0;
exit();
}
echo file_get_contents($_GET["path"]);
</li>
<li>Ctrl+S,保存把线上的接口数据到本地的api文件夹吧-_-||</li> </ul>
<h3>三、小结</h3>
<p>本文只是对前后端协作存在的问题和现有的几种常见模式做了简要的列举,JSON Schema 具体如何去运用,还有接口的维护问题、接口信息的获取问题没有具体阐述,这个后续有时间会整理下我对他的理解。</p>