Skip to content

Instantly share code, notes, and snippets.

@shawndxl
Last active June 1, 2016 03:45
Show Gist options
  • Save shawndxl/bd5be30ce7ade6479645f01b6f6fa992 to your computer and use it in GitHub Desktop.
Save shawndxl/bd5be30ce7ade6479645f01b6f6fa992 to your computer and use it in GitHub Desktop.
json、ajax、jsonp、src....

前后端的数据交换 以及在 Node \ PHP 中的异同

客户端、服务器的含义。

不过这里对某些前端工程师理解起来有个坑,比如像我,什么叫客户端,什么叫服务器呢?其实他们是放在一起的一堆文件,可能只是在不同的文件夹中,所谓的客户端,就是打开浏览器能够访问的文件,所谓服务器端就是打开浏览器无法直接观看的文件,需要通过前端文件请求调用才可以感知到的文件,所以从客户端像服务器请求的过程,可以理解为从自己的index.html的文件,像php/data.php发送数据的过程,而data的php跟index的php其实就是邻居,只不过打开浏览器之后,html文件,以及html引用到的css、js文件被加载到了浏览器上,而php文件依然留在原来的位置上(也就是你的文件运行的本地服务器或者网络服务器上),但这两者依然是邻居,理解这个邻居的概念很关键,因为他可以帮助理解下一步的jsonp,即当你想要请求的php或者node等服务器文件跟你的前端文件不是邻居时,应该怎么办。回到ajax,ajax的技术其实就是邻居之间传递数据的,比如index.html中引用的index.js,需要请求数据,那么则是这样。

php 赋值

这种方式在我理解根本不牵涉到什么前后端数据交换,因为本来这个页面打开就是.php的后缀,html内容只不过是在这个php页面中嵌套的一部分,页面本身是按照php渲染的,自然能够解析变量到各个 echo 中。这种情况只存在php中,其他后端语音比如Node肯定没办法这么干。
<!-- to element -->
<div data-name='<?php echo $name;?>'></div>
<script>
var name = $('div').data('name');
</script>
<!-- to js -->
<script>
window.data = {
  name: <?php echo $name;?>,
  age: <?php echo $age;?>
}
</script>
<script>
var name = data.name;
</script>

ajax

AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML)。

浏览器打开某个网址,可以理解为浏览器从web服务器请求数据加载的一个过程。既请求页面的所有数据,然后加载。 当然我们都知道,页面当中并不是所有数据需要立即加载过来的,同时加载过来的数据也是有可能变化的,这也就是ajax出现的意义。 AJAX 在浏览器与 Web 服务器之间使用异步数据传输(HTTP 请求),这样就可使网页从服务器请求少量的信息,而不是整个页面。 核心对象XMLHTTPRequest。通过这个对象,您的 JavaScript 可在不重载页面的情况与Web服务器交换数据。 但现在一般情况下已经不必深究XMLHTTPRequest的用法。因为常用的框架已经封装好了。 ajax是一种典型的CS数据交换模型,既客户端像服务器端请求数据,服务器端回复数据。相比与php赋值的方法,这种情况需要客户端主动触发请求,服务器才会被动响应请求回复数据。

// 这里直接用jquery封装好的ajax了,我们在今天所熟悉的ajax都是已经被封装好了的,用法简答,以至于我们都不在关心本来的ajax是如何使用的了,好吧,先这样吧
$.ajax({
  url: '../php/data.php',
  method: 'GET',
  data: {data: 'hello'},
  success: function(data) {
    alert(data)
  }
})
// 其实这两个文件的位置就只是 js/index.js,以及php/data.php而已
if (isset($_GET)) { // ajax 请求过的数据一般为 get 或者 post,php 文件响应回复 echo 即可。
  echo $_GET['data']; // 把前端的 穿过来的 data hello 再回复过去,所以js文件收到后会alert('hello');
}

xml 和 json

接着上一步,ajax 向后端文件发送数据之后,后端文件再回复给前端文件,那么后端文件应该回复什么样格式的前端文件呢,这就是常见的xml和json了,它们是一种用来传递数据的数据格式。
if (isset($_GET)) {
  echo "<xml version='1.0'>";
  echo "<msg>";
  echo "<name>shawn</name>"";
  echo "<age>20</age>";
  echo "</msg>";
}
可以看到 xml 的回复很麻烦,而且js文件的解析也相对来说麻烦,所以就有了json
if (isset($_GET)) {
  $data = array(
    'name' => 'shawn',
    'age' => '20'
  )
  echo jsonencode($data)
}
// js解析时就可以这样
$.ajax({
  url: 'php/data.php',
  method: 'GET',
  success: function(data) {
    var data = JSON.parse(data);
    var name = data.name;
    var age = data.age;
  }
});
// 甚至更简单,getJSON方法会自动解析json变成一个对象,直接调用即可
$.getJSON('php/data.php', function(data) {
  var name = data.name;
  var age = data.age;
})

跨域的 jsonp

刚刚谈到了ajax的邻居的概念,也就是说ajax只能请求同一个服务器上的文件,也就是ajax请求的文件都在同一个电脑上,如果ajax想要请求一个不在一个电脑上的文件呢?也就是网络上的某个服务器上的文件时怎么办呢,ajax肯定是不行了,(jquery把jsonp封装到了ajax中,但其实这是两种不同技术,分开理解比较好,既虽然在jquery中jsonp的用法依然是$.ajax,但理解时依然要分开理解),于是就有了jsonp,但jsonp其实是一种非官方的,但大家都用习惯了的一种用法。它的由来可以通过下面的例子来理解。

大家发现ajax不能够跨域(请求两个服务器上的文件就叫跨域),但大家发现前端中是有可以跨域的用法的,比如src属性,举个例子

<img src='http://baidu.com/******.png'>
<script src='http://google.com/jquery.js'></script>
上面的用法是可行的,那么能否这上面想想办法呢,可以,大家都知道

WebSocket

资料

原生
前端:

后端

其他技术

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment