您的位置:首页 > 理论基础 > 计算机网络

Ajax深入理解

2017-03-13 22:23 155 查看
来源:慕课网《Ajax全接触》 W3School Ajax教程

AJAX (Asynchronous Javascript and XML异步JS和XML)是与服务器交换数据并更新部分网页的艺术,在不重新加载整个页面的情况下。即:无需加载,局部更新。

同步:客户端提交表单并等待

异步:引入
XMLHttpRequest对象
,客户端提交表单后处理其他事情

通过 AJAX,JavaScript 无需等待服务器的响应,而是:

在等待服务器响应时执行其他脚本

当响应就绪后对响应进行处理

HTTP协议

http:计算机通过网络进行通信的规则,无状态协议(不建立持久链接)

请求:

GET/POST get一般用于查询,用URL传参,数量有限,2000个字符 post一般用于表单发送数据,用于修改服务器上的资源,发送信息无限制

URL

请求头(客户端环境信息身份验证等)

请求体(表单信息等)

一个完整的HTTP请求过程:

1. 建立TCP连接
2. Web浏览器向Web服务器发送请求命令
3. 发送请求头信息
4. Web服务器应答
5. 发送应答头信息
6. 向浏览器发送数据
7. 服务器关闭TCP数据  无记忆


响应

数字或文字状态码,用于显示成功或者失败

响应头(服务器类型、日期、内容类型、长度)

响应体(html代码,字符串)

一、JavaScript实现Ajax异步请求

1. 创建 XMLHttpRequest 对象

// IE7 + (IE5,6使用ActiveX 对象)

var xmlhttp=new XMLHttpRequest();


2. 向服务器发送XHR 请求

Get请求

xmlhttp.open("GET","demo_get.asp,true);
xmlhttp.send();


在上面的例子中,您可能得到的是缓存的结果。

为了避免这种情况,请向 URL 添加一个唯一的 ID:

xmlhttp.open("GET","demo_get.asp?t=" + Math.random(),true);
xmlhttp.send();


如果您希望通过 GET 方法发送信息,请向 URL 添加信息:

xmlhttp.open("GET","demo_get2.asp?fname=Bill&lname=Gates",true);
xmlhttp.send();


Post请求

xmlhttp.open("POST","demo_post.asp",true);
xmlhttp.send();


如果需要像 HTML 表单那样 POST 数据,请使用 setRequestHeader() 来添加 HTTP 头。然后在 send() 方法中规定您希望发送的数据:

xmlhttp.open("POST","ajax_test.asp",true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("fname=Bill&lname=Gates");


3. XHR readyState和来自服务器的XHR响应

下面是 XMLHttpRequest 对象的三个重要的属性:

onreadystatechange:存储函数(或函数名),每当 readyState 属性改变时,就会调用该函数。

readyStatus:存有 XMLHttpRequest 的状态。从 0 到 4 发生变化。
0: 请求未初始化
1: 服务器连接已建立
2: 请求已接收
3: 请求处理中
4: 请求已完成,且响应已就绪

status:
200:"ok"
404:未找到页面


xmlhttp.onreadystatechange=function(){
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
xmltext=xmlhttp.responseText;
//获得字符串形式的响应数据
}


如需获得来自服务器的响应,请使用 XMLHttpRequest 对象的 responseText 或 responseXML 属性。

responseText:获得字符串形式的响应数据。
responseXML:获得 XML 形式的响应数据。


4. 一个完整的应用实例

var xmlhttp;
xmlhttp=null;
if (window.XMLHttpRequest)
{// code for Firefox, Opera, IE7, etc.
xmlhttp=new XMLHttpRequest();
}
else if (window.ActiveXObject)
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
if (xmlhttp!=null)
{
xmlhttp.onreadystatechange=state_Change;
xmlhttp.open("GET",url,true);
xmlhttp.send(null);
}
else
{
alert("Your browser does not support XMLHTTP.");
}
}

function state_Change()
{
if (xmlhttp.readyState==4)
{// 4 = "loaded"
if (xmlhttp.status==200)
{// 200 = "OK"
document.getElementById('T1').innerHTML=xmlhttp.responseText;
}
else
{
alert("Problem retrieving data:" + xmlhttp.statusText);
}
}
}


二、jquery中Ajax封装

$.ajax()

$.ajax({
type:"post",
url:"index.php",
data:{
"name":"chenyueli",
"charactor":"humorous and funny"
},
success:function(rData){
if(rData.errno == 1){
//成功操作
}else{
alert(rData.errMsg);
}
}
},"json");


.get()和.post()

$.post("index.php",{"name":"chenyueli"},function(rData,textStatus){
if(rData.errno == 1){
//成功操作
}else{
alert(rData.errMsg);
}
},"json");

$.get("index.php",function(rData,textStatus){
if(rData.errno == 1){
//成功操作
}else{
alert(rData.errMsg);
}
},"json");


附:服务器返回的HTTP状态码列表

http://www.itxueyuan.org/view/6454.html

XMLHttpRequest 对象的 status 和 statusText 属性保存有服务器返回的 http 状态码,不同的是,status 属性保存的状态码是以数字表示的,而 statusText 属性保存的状态码是以字符串表示的。

附录:XMLHttpRequest 对象 status 和statusText 属性对照表

status  statusText  说明
0** -   未被始化
1** -   请求收到,继续处理
100 Continue    客户必须继续发出请求
101 Switching protocols 客户要求服务器根据请求转换HTTP协议版本
2** -   操作成功收到,分析、接受
200 OK  交易成功
201 Created 提示知道新文件的URL
202 Accepted    接受和处理、但处理未完
4000
成
203 Non-Authoritative Information   返回信息不确定或不完整
204 No Content  请求收到,但返回信息为空
205 Reset Content   服务器完成了请求,用户代理必须复位当前已经浏览过的文件
206 Partial Content 服务器已经完成了部分用户的GET请求
3** -   完成此请求必须进一步处理
300 Multiple Choices    请求的资源可在多处得到
301 Moved Permanently   删除请求数据
302 Found   在其他地址发现了请求数据
303 See Other   建议客户访问其他URL或访问方式
304 Not Modified    客户端已经执行了GET,但文件未变化
305 Use Proxy   请求的资源必须从服务器指定的地址得到
306     前一版本HTTP中使用的代码,现行版本中不再使用
307 Temporary Redirect  申明请求的资源临时性删除
4** -   请求包含一个错误语法或不能完成
400 Bad Request 错误请求,如语法错误
401 Unauthorized    请求授权失败
402 Payment Required    保留有效ChargeTo头响应
403 Forbidden   请求不允许(由于服务器上文件或目录的权限设置导致资源不可用)
404 Not Found   没有发现文件、查询或URl(没有找到指定的资源)
405 Method Not Allowed  用户在Request-Line字段定义的方法不允许
406 Not Acceptable  根据用户发送的Accept拖,请求资源不可访问
407 Proxy Authentication Required   类似401,用户必须首先在代理服务器上得到授权
408 Request Timeout 客户端没有在用户指定的饿时间内完成请求
409 Conflict    对当前资源状态,请求不能完成
410 Gone    服务器上不再有此资源且无进一步的参考地址
411 Length Required 服务器拒绝用户定义的Content-Length属性请求
412 Precondition Failed 一个或多个请求头字段在当前请求中错误
413 Request Entity Too Large    请求的资源大于服务器允许的大小
414 Request-URI Too Long    请求的资源URL长于服务器允许的长度
415 Unsupported Media Type  请求资源不支持请求项目格式
416 Requested Range Not Suitable    请求中包含Range请求头字段,在当前请求资源范围内没有range指示值,请求也不包含If-Range请求头字段
417 Expectation Failed  服务器不满足请求Expect头字段指定的期望值,如果是代理服务器,可能是下一级服务器不能满足请求
5** -   服务器执行一个完全有效请求失败
500 Internal Server Error   服务器产生内部错误
501 Not Implemented 服务器不支持请求的函数
502 Bad Gateway 服务器暂时不可用,有时是为了防止发生系统过载
503 Service Unavailable 服务器过载或暂停维修
504 Gateway Timeout 关口过载,服务器使用另一个关口或服务来响应用户,等待时间设定值较长
505 HTTP Version Not Supported  服务器不支持或拒绝支请求头中指定的HTTP版本
12029   an unknown error occurred while processing the request on the server. the status code returned from the server was : 12029  原因:网络不通. 刷新一下就知道了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息