Ajax全解析
Ajax的概述
ajax的概念
Ajax 即 Asynchronous Javascript And XML,Ajax不是一门新的语言,而是对现有技术的综合利用。本质是在HTTP协议的基础上以异步的方式与服务器进行通信。
异步的概念
指某段程序执行时不会阻塞其他程序的执行,其表现形式为程序的执行顺序不依赖本身的书写顺序,相反则为同步。
通俗来讲就是执行一件事情的同时可以执行另一件事情,从而提高整体的效率。
其优势在于不阻塞程序的执行,从而提高整体执行效率。
浏览器请求服务器的过程
- 打开浏览器
- 输入请求地址
- 敲回车发送请求
Ajax请求服务器的过程
-
创建ajax对象
var xhr = new XMLHttpRequest(); XMLHttpRequest 是浏览器内置对象,用于在后台与服务器通信(交换数据),由此我们便可以实现对网页的
-
创建新的http请求(并设置请求地址)
xhr.open('get','./02.php'); xhr.open(请求方式get/post,url请求地址) post方式发送请求时 需要设置请求头 xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded'); get请求可以不设置 调用open()方法并不会真正发送请求,而只是启动一个请求已被发送
-
发送请求给服务端
xhr.send(null) (get请求方式时) 或 xhr.send('name = jim') (post请求方式时) post方式发送请求时 需要设置信息 get方法发送请求时 信息拼接到url地址中 xhr.open('get','http://网址/index.php?name=tom&age=23&addr=sh<br/>')
-
给ajax设置事件
xhr.onreadystatechange = function(){ if(xhr.readyState == 4 && xhr.status == 200){ console.log('xhr' + xhr.responseText); //xhr.responseText是从请求地址中请求到的数据 } } onreadystatechange 是js中的事件的一种 存储函数或函数名,其意义在于监听,每当 readyState 属性改变时,就会调用该函数。 xhr.readyState 存有 XMLHttpRequest 的状态。从 0 到 4 发生变化。 0: 请求未初始化 1: 服务器连接已建立 2: 请求已接收 3: 请求处理中 4: 请求已完成,且响应已就绪 由于服务器做出响应需要时间(比如网速慢等原因),所以我们需要监听服务器响应的状态,然后才能进行处理。 获取状态行 xhr.status 状态码 200: "OK" 404: 未找到页面 xhr.statusText 状态码信息 获取响应头 xhr.getResponseHeader('Content-Type'); xhr.getAllResponseHeaders(); 响应主体 xhr.responseText xhr.responseXML 我们需要检测并判断响应头的MIME类型后确定使用reauest.responseText或者request.responseXML
Ajax中的API详解
- xhr.open() 发起请求,可以是get、post方式
- xhr.setRequestHeader() 设置请求头
- xhr.send() 发送请求主体get方式使用xhr.send(null)
- xhr.onreadystatechange = function () {} 监听响应状态
- xhr.status表示响应码,如200
- xhr.statusText表示响应信息,如OK
- xhr.getAllResponseHeaders() 获取全部响应头信息
- xhr.getResponseHeader('key') 获取指定头信息
- xhr.responseText、xhr.responseXML都表示响应主体
get请求和post请求的区别
1. 给服务器传递的数据量
- get方式的大小是受限于浏览器,每个浏览器的限制不一样,大部分浏览器是2k的限制 chrome就是8k
post原则没有限制,php.ini对其限制为8M - 安全方面:post传递数据较安全。
- 传递数据的形式不一样
get没有请求主体,以xhr.send(null)形式发送请求
get方式在url地址后边以请求字符串形式传递参数
http://网址/index.php?name=tom&age=23&addr=sh
问号后面就是请求字符串,用问号连接网址与数据请求字符串一般是"名-值"的键值对,中间使用&符号连接
post方式是把form表单的数据请求出来以xml形式传递给服务器
post可以通过xhr.send('name=tom&age=19')形式发送请求 - post需要设置请求头 get不需要设置
xhr.setRequestHeader('Content-type','application/x-www-form-urlencoded')
数据格式
XML
- XML 是可扩展标记语言(Extensible Markup Language)的缩写,其中的 标记(markup)是关键部分。XML 可以创建内容,然后使用限定标记标记它,从而使每个单词、短语或块成为可识别、可分类的信息。您创建的文件,或文档实例 由元素(标记)和内容构成。
- 虽然可以描述和传输复杂数据,但是其解析过于复杂并且体积较大,所以实现开放已经很少使用了
- 特点
- 必须要有根元素 (root)
- 不能以空格,数字或者"."开头,对大小写敏感
- 不能交叉嵌套
- 属性双引号
- 特殊符号要使用实体
- 注释和HTML一样
-
格式
<?xml version="1.0" encoding="UTF-8"?> <root> <arrayList> <array> <src>images/banner.jpg</src> <newPirce>12.00</newPirce> <oldPrice>30.00</oldPrice> </array> <array> <src>images/banner.jpg</src> <newPirce>12.00</newPirce> <oldPrice>30.00</oldPrice> </array> </arrayList> </root>
JSON
- JavaScript Object Notation,另一种轻量级的文本数据交换格式,独立于语言。
- 特点:
- 数据在键值对中
- 数据用","分开,最后一个数据不能带","
- "[]"保存数组,"{}"保存对象
- 键和值都必须用""包裹
-
格式
[ {"src":"images/detail01.jpg","oldPrice":"10.12","newPrice":"130.00"}, {"src":"images/detail02.jpg","oldPrice":"1.00","newPrice":"11.00"}, {"src":"images/detail03.jpg","oldPrice":"100.00","newPrice":"1000.00"} ]
JSON数据的解析
json字符串和php对象之间的相互转换
-
把php对象转化成json格式的字符串 -- json_encode
$jsonStr = json_encode($phpArr);
-
把json字符串解析成php对象 -- json_decode
$jsonObject = json_decode($jsonStr);
json字符串和json对象之间的相互转化
-
json字符串转化成json对象 -- JSON.parse
var jsonStr = '[{"name":"jim","age":"10"}]'; var jsonObj = JSON.parse(jsonStr);
-
json对象转化成json字符串 -- JSON.stringify
var jsonObj = {name:'jim',age:10}; var jsonStr = JSON.stringify(jsonObj);
jQquery中的Ajax
jQquery为我们提供了更强大的Ajax封装
$.ajax({
type: 'post'/'get',
url: '发送请求的地址',
data: '是一个对象,连同请求发送到服务器的数据',
//dataType是预期服务器返回的数据.如果不指定,jq将自动根据HTTP包MIME信息来智能判断,一般我们使用json格式
dataType:'json',
beforeSend: function () {
//发送请求前就调用的函数
},
success: function (data) {
//请求成功时的回调函数
//传入返回后的数据,以及包含成功代码的字符串
//data是从后台获得的数据
},
complete: function () {
//请求完成时的调用函数
},
error: function (err,errmsg) {
//请求出现错误时的调用函数
//传入XMLHttpRequest对象
}
});
HTTP协议
HTTP是一种无状态协议
HTTP请求的过程
一个完整的HTTP请求过程,通常有下面7个步骤
- 建立TCP连接
- web浏览器向web服务器发送请求命令
- web浏览器发送请求头信息
- web服务器应答
- web服务器发送应答头信息
- web服务器向浏览器发送数据
- web服务器关闭TCP连接
HTTP请求的构成
一个HTTP请求一般由四个本分组成
- HTTP请求的方法或动作,比如是get还是post请求
- 正在请求的URL,即请求的地址
- 请求头,包含一些客户环境信息,身份验证信息等
- 请求体,也就是请求正文,请求正文中可以包含客户提交的查询字符串信息,表单信息等等
HTTP响应的组成
一个HTTP响应一般由三个部分组成
- 状态码:由数字和文字组成,用来显示请求成功还是失败
- 响应头:包含很多信息,例如服务器类型,日期时间,内容类型和长度等
- 响应体:也就是响应正文
同源&跨域
同源策略
同源策略是浏览器的一种安全策略,所谓同源是指,域名,协议,端口完全相同。
同源
一个域名的组成 : 协议 子域名 主域名 端口号 请求资源地址
当协议,子域名,主域名。端口号都相同时才算同源 有任意一个不相同时,都算作不同域。
跨域
不同域之间相互请求资源,就算作“跨域”。浏览器出于安全方面的考虑,不允许跨域调用其他页面的对象。
处理跨域的方法
一.代理
通过在同域名的web服务器端创建一个代理
二. JSONP
JSON Padding
JSONP可用于解决主流浏览器的get请求中跨域数据访问的问题
原理:其本质是利用了标签具有可跨域的特性, 由服务端返回一个预先定义好的Javascript函数的调用,并且将服务器数据以该函数参数的形式传递过来,此方法需要前后端配合完成。
<!--当我们用script标签去加载的时候 会把内容解析成js去执行-->
<script>
function fuc(data){
console.log(data.name);
}
</script>
<script src="http://www.guangzhou.com/api.php?callback=fuc"></script>
<!--JSONP下的ajax请求-->
$.ajax({
type: 'post'/'get',
url: '发送请求的地址',
data: '是一个对象,连同请求发送到服务器的数据',
//dataType是预期服务器返回的数据.如果不指定,jq将自动根据HTTP包MIME信息来智能判断,一般我们使用json格式
<!--数据格式为jsonp-->
dataType:'jsonp',
<!--需要一个jsonp属性 后台需要做出相应的修改-->
jsonp:'callback',
beforeSend: function () {
//发送请求前就调用的函数
},
success: function (data) {
//请求成功时的回调函数
//传入返回后的数据,以及包含成功代码的字符串
//data是从后台获得的数据
},
complete: function () {
//请求完成时的调用函数
},
error: function (err,errmsg) {
//请求出现错误时的调用函数
//传入XMLHttpRequest对象
}
});
三. XHR2
-
HTML5提供的XMLHttpRequest Level已经实现了跨域的访问及其他的一些新功能
-
IE10以下版本都不支持
-
在服务端做一些小小的改造即可
header('Access-Control-Allow-origin:*');
header('Access-Control-Allow-Method:POST,GET');