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

作为刚接触前端的不久的童鞋,大家都会兴奋于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.io,Ratchet.当然node.js写 socket也非常得心应手,node.js对高并发支持相对较好,可以使用http://socket.io/。

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

Demo教程

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

小结

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

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

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

  1. Spring+SpringMVC+MyBatis明日方舟版人员信息管理系统前端页面代码前后端交互+SSM框架 管理员登录 游客登录 普通用户登录 人员的增删改查 信息更新 图片上传 分页查询)

    Spring+SpringMVC+MyBatis明日方舟版人员信息管理系统前端页面代码(前后端交互+SSM框架 管理员登录 游客登录 普通用户登录 人员的增删改查 信息更新 图片上传 分页查询 修改密 ...

  2. Vue:前端体系与前后端分离

    Vue:前端体系与前后端分离 概述 介绍 ​ Vue(读音/viu/,类似于 view)是一套用于构建用户界面的渐进式框架,发布干 2014 年 2 月. 与其它大型框架不同的是,Vue 被设计为可以 ...

  3. 前后端交互ajax和axios入门讲解,以及http与服务器基础

    ajax和http小白入门,客户端与服务器基础讲解,前后端交互(从入门到实践详细解析) 文章目录 ajax和http小白入门,客户端与服务器基础讲解,前后端交互(从入门到实践详细解析) 前言 一.Aj ...

  4. 大前端–Vue前端体系、前后端分离

    大前端–Vue前端体系.前后端分离 前言 Soc:关注点分离原则 HTML+CSS+JS(视图):给用户看,刷新后台给的数据 网络通信:axios 页面跳转:vue-router 状态管理:vuex ...

  5. 从前端Vue/Axios到后端交互--浅谈Vue生命周期、Ajax调用

    一.基本需求 介绍: 此项目实现了对数据库数据的增删查改,后端使用Spring+MyBatis+SpringMVC,前端使用了Vue+JavaScript+AJAX,前后端实现了异步交互,前端页面可以 ...

  6. 前端angular与服务器端nodejs实现从mysql数据库读取数据实现前后端交互实例

    一.angular前端交互 使用angular框架的人都知道angular提供了内置的HttpClientModule模块来实现前后端交互请求. 实际操作如下: 1.在app.module.ts文件中 ...

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

    原文:购物车Demo,前端使用AngularJS,后端使用ASP.NET Web API(2)--前端,以及前后端Session chsakell分享了前端使用AngularJS,后端使用ASP.NE ...

  8. 前后端交互中,返回前端的自定义响应数据结构

    在前后端交互分离的体系下,我们后端一般会将返回给前端的信息数据进行格式的统一,然后返回前端json串:,一下我提供了一个模板,在实际开发中可进行参考 package com.project.util; ...

  9. angular和JAVA实现aes、rsa加密解密,前后端交互,前端加解密和后端JAVA加解密实现

    今天实现了下AES和RSA加密解密,主要的功能是对前后端交互数据进行加密解密,为什么要用到两个算法呢,首先RSA默认的话加密长度是有限的100多个byte吧大约,并且需要公钥私钥,而AES加密没有限制 ...

最新文章

  1. brew安装指定版本mysql,Mac 系统为 Valet 开发环境安装指定版本 MySQL
  2. comboBox绑定对象数组 c# 1614065159
  3. 如何将Webpack与React结合使用:深入的教程
  4. linux系统环境与文件权限
  5. 为什么我的IP地址经常变化
  6. pands选取满足条件的行和列
  7. latex中文简历,硕博士找工作实习用,顶级简约简历
  8. 12306网站火车票抢票详细攻略(gohome抢票程序)
  9. Python 基础 之 词云(词的频率统计大小成图)的简单实现(包括图片词云,词云颜色,词的过滤)
  10. 酷我音乐盒在听一遍就自己默认下载…
  11. Kernel Panic 介绍
  12. spring boot清远旅游推荐网站的开发毕业设计-附源码211551
  13. 这个发现是否会是RSA算法的BUG、或者可能存在的破解方式?
  14. 工作了 需要学OC 写博客来总结学习中的重点 忘记了可以再看一看
  15. 高效mongoDB开发规范
  16. unity中的渲染优化技术
  17. [乐意黎转载]细数 javascript 容易被忽略的语法陷阱
  18. abp 打包部署到ubuntu_如何通过宝塔运维面板进行部署?
  19. 在计算机软件中 BIOS的中文意思是,电脑bios是什么意思
  20. 魔兽世界服务器是怎么维护的,魔兽世界服务器维护时 玩家可做的七件事

热门文章

  1. jradiobutton设置默认选项_JRadioButton(单选按钮)添加事件监听
  2. mockmvc get请求 tm的 一直404_面试:SpringMVC在接收到请求后的调用细节是什么?
  3. 说一下你对多态的理解?_掌握了多态的特性,写英雄联盟的代码更少啦!
  4. java前端目录_[Java教程]前端那点事儿——Tocify自动生成文档目录
  5. 使用LeNet对于旋转数字进行识别:合并数字集合
  6. 智能车竞赛技术报告 | 单车拉力组 - 哈尔滨工业大学 - 紫丁香
  7. 节能无线信标Ver0:功率测试
  8. AD5933测量容性负载时的神秘振荡信号
  9. 为什么使用LM386可以直接收听调频电台节目?
  10. Mac的访达中,如何只搜索当前文件夹的内容?