首页 > 代码库 > ajax之请求对象的创建以及它与服务器之间的4次“握手”(好吧其实只有3次)

ajax之请求对象的创建以及它与服务器之间的4次“握手”(好吧其实只有3次)

request对象的创建

对于request对象的创建,我们总会第一时间反映到下列语句

var request=new XMLHttpRequest();

不过因为各大浏览器之间的相互斗殴行为,事情是不会这么简单的。

比如非常经典的:IE浏览器没有XMLHttpRequest函数。

但这难不倒我们聪明机智的程序员,我们也有经典的应对措施:

function createRequest(){
    try{
        request=new XMLHttpRequest();
    }catch(tryMS){
        try{
            request=new ActiveXObject("Msxml2.XMLHTTP");
        }catch(otherMS){
            try{
                request=new ActiveXObject("Microsoft.XMLHTTP");
            }catch(failed){
                request=null;
            }
        }
    }
    return request;
}
var request=createRequest();

此方法兼容各大浏览器,可收藏至自己的utils.js当中。

request对象与服务器的几次“握手”

其实就本质而言,request对象是先向浏览器请求,然后浏览器再向服务器请求;然后服务器做出反馈,浏览器接收到返回后对request对象做出修改。

首先是checkName.php的代码:

<?php

$takenUsernames = array (‘bill‘, ‘ted‘);

sleep(2);

if (!in_array( $_REQUEST[‘username‘], $takenUsernames )) {
	echo ‘okay‘;
} else {
	echo ‘denied‘;
}

?>

注意sleep(2)这个语句。

然后是JavaScript的代码:

function checkUsername(){
    var url="checkName.php?username="+userName;
    request.onreadystatechange=showUsernameStatus;
    request.open("GET",url,true);
    request.send(null);
}
function showUsernameStatus(){
    console.info((new Date)+"request.readyState : "+request.readyState+"request.responseText : "+request.responseText);
}

当checkUsername被执行且username不为“bill”或“ted”时,可在控制台看到:

Mon Aug 25 2014 21:37:01 GMT+0800 (中国标准时间)request.readyState : 1 request.responseText :  
Mon Aug 25 2014 21:37:03 GMT+0800 (中国标准时间)request.readyState : 2 request.responseText :  
Mon Aug 25 2014 21:37:03 GMT+0800 (中国标准时间)request.readyState : 3 request.responseText :  
Mon Aug 25 2014 21:37:03 GMT+0800 (中国标准时间)request.readyState : 4 request.responseText : okay

可以看到request.onreadystatechange事件被触发了4次。这4次具体是这样子的:

第一次:request.open("GET",url,true)执行完毕,request.readyState为1,请求已准备好可以发送

第二次:request.readyState为2,表示服务器已接收到请求并正在处理

第三次:request.readyState为3,数据下载到请求对象,但相应数据还没有完全准备好,还不能使用

第四次:request.readyState为4,服务器处理完请求,数据可以使用,可以看到,此时request.responseText已有“okay”这个值

以上就是request和服务器的4次“握手”。

如果我们在进行ajax编程时无法得到返回的数据,可以看看请求对象的readyState属性的值,便可以知道服务器那边的处理是进行到哪一步再出现问题。

ajax之请求对象的创建以及它与服务器之间的4次“握手”(好吧其实只有3次)