写给刚入门的前端工程师的前后端交互指南

转自原文 写给刚入门的前端工程师的前后端交互指南

作为刚接触前端的不久的童鞋,大家都会兴奋于CSS和JS所带来漂亮界面,然而,前端工程师除了UI重构外,还有非常重要的职责在正确的区域渲染出服务端的数据。毕竟,我们要构建一个大的web应用,必然不是普普通通的静态页面构成。

下文将罗列将来前端工程师应该必备的同后端打交道的常用技能。

服务端渲染

谈起服务端渲染,对于动态服务而言,这个世界上跑的大多数页面都经历过服务端的数据渲染,接口->前端赋值->模版渲染 。这一切都在服务器完成,我们查看源码时候,可以看到完整的html代码,包括每个数据值。

常用的php模版有,Smarty,Blade,Mustache,如果你们团队使用Smarty,我们可以看到一些view的文件里会前套Smarty的模版语言;

<div>
{foreach $list as $item}
    <h3>{$item[‘name‘]}</h3>
    <p>{$item[‘desc‘]}</p>
{/foreach}
</div>

如果Node,js作为服务端的话,这个时候我们可以使用前端模版渲染的模块,比如ejs,doT,jade等等。

注意不同的模版可能存在不同模版语法,需要自己学习使用

AJAX

当然服务端渲染随着单页应用以及Restful接口的兴起,Ajax逐渐成为目前前后端交流最为频繁的方式。Ajax实际核心是XmlHttpRequest,我们通过对该对象的操作来进行异步的数据请求。

// 一般流程
var oReq = new XMLHttpRequest();
oReq.addEventListener("load", function(res) {
    // your code to do something
});
oReq.open("GET", "http://www.example.org/example.txt");
oReq.send();

实际上我们接触到最多jQuey就有很好的封装,比如$.ajax$.post等,如果用Angular的话我们可以用$http服务,除了这些之外,我们可以使用第三方的Ajax库qwest等。

如果使用Ajax的话,我们不得不面临一些问题,由于同源限制的问题,我们不得不去克服这个问题,这个时候我们可以要求服务端,设置header头,header(‘Access-Control-Allow-Origin: *‘);或者叫设置nginx配置

add_header ‘Access-Control-Allow-Origin‘ ‘http://yourweb.com‘;
add_header ‘Access-Control-Allow-Credentials‘ ‘true‘;
add_header ‘Access-Control-Allow-Methods‘ ‘GET‘;

当然这不是最好的做法,实际现在我们也可以这么做:

ajax -> 代理 -> API

我们可以用php的curl或者通过服务器的配置来实现反向代理。从而达到同源的效果。

前端工程师一定要要求每次请求的数据接口一严格遵循基础的数据结构要求,尽管js是弱变量类型语言,但是我们还是应该严格要求,是数组,就不应该是对象,是数字就不应该是字符串,这样做有利于降低隐藏bug并且提升前后端工作效率。

JSONP

JSONP算作JSON的一种”使用模式”,可用于解决主流浏览器的跨域数据访问的问题。由于CORS的支持,我们可以简单的将数据封装成一个js脚本请求,当然我们在jquery中会用到。

function logResults(json){
  console.log(json);
}
$.ajax({
  url: "https://yourapi.com/api",
  dataType: "jsonp",
  jsonpCallback: "logResults"
});

comet

聊Comet我们还得说下短轮询,由于某些特定的业务需求,比如通知,我们需要有及时的数据更新,我们能够想到的就是使用setInterval每隔一定时间比如10s去获取一次请求,从而做到一些通知更新,但是这并不一种高效的做法,这会增加服务器的请求数量。这个时候有了另外一种概念,“反向Ajax”,由服务器进行数据推送, Comet能够让信息近乎实时的被推送到页面上,非常适合要求实时性的获取的数据的页面。

如图所示,就是一个简单的Comet模型,就是数据请求后挂起,直到有数据响应推送到客户端,这个时候客户端再发起一个新的连接。

这样相对来说可以减少一定数量的请求,以及数据的及时响应,从而一定意义的实现所谓推送。

一个简单的PHP Demo代码,就是我们需要这端代码一直运行着…

while(true) {
    set_time_limit(0);
    echo ‘data‘;
    flush();
    b_flush();
    sleep(3);
}

JavaScript:

function createStreamingClient(url,progress,finished){
    var xhr=new XMLHttpRequest(),received=0;
    xhr.open("get",url,true);
    xhr.onreadystatechange=function(){
        var result;
        if(xhr.readyState==3){
            result=xhr.responseText.substring(received);
            received+=result.length;
            progress(result);
        }else if(xhr.readyState==4){
             finished(xhr.responseText);
        }
    };
    xhr.send(null);
    return xhr;
}

//  var client = createStreamingClient(url,fuc1,func2)

SSE Server-Sent Events

SSE是围绕只读Comet交互推出的API或者模式。SSE API用于创建到服务器的单向连接,服务器通过这个连接可以发送任意数量的数据。服务器响应的MIME类型必须是text/event-stream,而且是浏览器中的Javascript API能解析的格式输出。

现对于Comet,我们可以看出我们只进行了一次连接,然后服务端会去控制数据的响应,从而发送给客户端。这样相对来说,但是如同定义的描述,这种只适合只读数据的情形。比如一些通知和状态码这样的。SEE的使用非常简单,只需要掌握这几个api就行:

var es = new EventSource(‘http://your.api.com‘
function listener(event) {
    console.log(event.data);
}
// 创建一个SSE连接
es.addEventListener("open", listener);
// 响应获取消息的事件
es.addEventListener("message", listener);
// 发生错误
es.addEventListener("error", listener);

注意:如果在回话过程中遇见错误后,默认程序会重新发起一次新的连接,从而防止挂掉就不再响应了

服务端(node,php)的代码,可以参考:https://github.com/Yaffle/EventSource

Web Sockets

HTML5 WebSocket 设计出来的目的就是要取代轮询和 Comet 技术,使客户端浏览器具备像 C/S 架构下桌面系统的实时通讯能力。 浏览器通过 JavaScript 向服务器发出建立 WebSocket 连接的请求,连接建立以后,客户端和服务器端就可以通过 TCP 连接直接交换数据。也就是我们可以使用web技术构建实时性的程序比如聊天游戏等应用。

其实Web Sockets 的API很少,就下面这些

websocket = new WebSocket("ws://your.socket.com:9001");
// 大开
websocket.onopen = function(evt) { /* do stuff */ }; //on open event
// 当web socket关闭
websocket.onclose = function(evt) { /* do stuff */ };
// 进行通信时
websocket.onmessage = function(evt) { /* do stuff */ };
// 发生错误时
websocket.onerror = function(evt) { /* do stuff */ };
// 向服务器发发送消息
websocket.send(message); //send method
websocket.close(); //close method

对于服务端的话,PHP支持了很多socket 相关api,但是我们可以使用更加成熟的框架(实用)比如phpsocket.ioRatchet.当然node.js写 socket也非常得心应手,node.js对高并发支持相对较好,可以使用http://socket.io/

服务端大概会做下面的事情: + 创建一个socket + 绑定地址和端口 + 监听进入的连接 + 接收新的连接 + web socket 握手 + 解码数据

Demo教程

注意:SSE和 Web Sockets 都是新的api,需要大家考虑兼容性*

小结

说了那么多简单总结下,大家想明白几点就行了,客户端与服务端谁先主动,是否强调数据的实时性。

  • AJAX – 请求 → 响应 (频繁使用)
  • Comet – 请求 → 挂起 → 响应 (模拟服务端推送)
  • Server-Sent Events – 客户单 ← 服务端 (服务端推送)
  • WebSockets – 客户端 ↔ 服务端 (未来趋势,双工通信)
时间: 2024-12-24 09:02:38

写给刚入门的前端工程师的前后端交互指南的相关文章

购物车Demo,前端使用AngularJS,后端使用ASP.NET Web API(2)--前端,以及前后端Session

原文:购物车Demo,前端使用AngularJS,后端使用ASP.NET Web API(2)--前端,以及前后端Session chsakell分享了前端使用AngularJS,后端使用ASP.NET Web API的购物车案例,非常精彩,这里这里记录下对此项目的理解. 文章:http://chsakell.com/2015/01/31/angularjs-feat-web-api/http://chsakell.com/2015/03/07/angularjs-feat-web-api-en

Ajax+Node.js前后端交互最佳入门实践(01)

1.Node.js简介 1.0.前后台数据交互流程 在web开发中,我们经常听说前端和后台,他们分别是做什么具体工作的呢?他们怎样交互的呢?我们得把这些基础的问题都搞明白了,才有一个大致的学习方向,首先,我们来看一张生活中几乎每个人都经历过的一个场景,如下图: 当你去餐馆吃饭的时候,坐下后服务员会带着一个菜单过来,问你需要点什么菜,这个时候你浏览了菜单上的菜,把想吃的菜告诉服务员,服务员把你点的菜拿到后台,后台根据你点的菜名,逐一完成,菜做完后叫服务员给你上菜,就这么一个场景其实和我们web开发

通过nginx部署前端代码实现前后端分离

实现前后端分离,可以让前后端独立开发.独立部署.独立单测,双方通过JSON进行数据交互. 对于前端开发人员来说,不用每次调试都需要启动或配置Java/Tomcat运行环境:对于后端开发人员来说 ,也不用在需要往JSP页面注入数据. 通过nginx来部署前端代码,可以帮助前端实现以下基本需求: 1.请求转发,解决请求跨域的问题 server { listen       7777; location /{ root   /Users/xiaoyun/git/someproject/dist; }

Web前端工程师工作前 VS 工作后

你还能想起工作前的惬意与潇洒吗?睡到自然醒那是不在话下,每天行程也安排的满满,吃喝玩乐手到擒来,可是工作后的你-- 算了,说多了都是眼泪,还是缅怀一下吧~~~ http://www.icketang.com 人生那么短,何苦碌碌无为.虽然你还怀念工作前的美好憧憬,但又穷又闲的生活,再年轻又有何用.也许有的人说没钱的日子也能快乐,但努力去赚钱的过程,是不是又与快乐本身有关呢. 现在的你是否正在努力并快乐的赚钱呢?

Ajax+Node.js前后端交互最佳入门实践(06)

6.XMLHttpRequest对象 XMLHttpRequest 是一个 API,它为客户端提供了在客户端和服务器之间传输数据的功能.它提供了一个通过 URL 来获取数据的简单方式,并且不会使整个页面刷新.这使得网页只更新一部分页面而不会打扰到用户.XMLHttpRequest 在 AJAX 中被大量使用. 6.1.创建XMLHttpRequest对象 6.1.1 XMLHttpRequest兼容性问题 XMLHttpRequest在ie6以下是以插件的形式来使用的,没有内置在浏览器中,所以在

前端跨域及前后端交互验证

JWT Json Web Token,是一个token的加密处理方式 是目前阶段比较流行的一种token处理方式 http请求是无状态的,为了保证多次请求之间的状态数据 ,可以使用token或者cookie的方式来传递用户状态 不同域名之间发送的请求 可以在ajax中设置withCreadentials来保存cookie数据, 同时需要指定服务器端cors的源不为"\*" 配置项 withCreadentials为true 跨域问题 前端无法解决跨域, 可以通过服务器端添加带来服务器做

Ajax+Node.js前后端交互最佳入门实践(04)

4.JSON 4.1 什么是JSON? JavaScript 对象表示法(JavaScript Object Notation)简称JSON,是一种轻量级的数据交换格式.虽然它基于JavaScript的对象字面量表示法,但是它于语言却是无关的,这里说的无关意思是说没有依赖关系,不是说只有在js中才能用,再别的语言中也是可以用的. var student = { "name": '张三', "age": 29, "data":[1,2,3] };

Ajax+Node.js前后端交互最佳入门实践(07)

7.ajax函数封装 7.1.实例引入 需求: 每秒钟请求一次服务器 获取到数据 实现: 把ajax进行封装 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script src="ajax.js" type="text/javascript" charset="utf

什么是前端工程师?前端工程师需要掌握什么技能?

什么是前端工程师?前端工程师需要掌握什么技能? 前言 前端工程师是一个出现了10年左右,而颇受重视则是最近这五六年的事情.受到重视到前端从业人员井喷,也就是这一两年而已.因为前端工程师这个职位出现得太晚,导致各大学校均没有系统的相关教学,我们所熟知的各个大牛均是自我研究自我学习的.而随着google推出v8引擎以来,尤其是gmail对ajax的应用,再随着jquery的出现,解决了各大浏览器的兼容问题,而nodejs则将js推向服务器端,javascript从一个边角料的语言变成了一个性能强劲,