码迷,mamicode.com
首页 > Web开发 > 详细

Code笔记 之:ajax诡异的错误-请求status为200

时间:2016-06-17 16:52:28      阅读:761      评论:0      收藏:0      [点我收藏+]

标签:

诡异jquery ajax satus为200却出现错误

今天遇到的问题,不知道如何解决了。出现这样的情况,不是因为jquery的ajax写法失败,也不是请求失败,那是什么呢?

1、jquery的ajax请求的主要参数

beforeSend:发送ajax请求之前

success:发送ajax请求成功

error:发送ajax请求错误,通常是网络失去连接、服务器出错、后台方法错误等造成的

2、目前的现象

自身代码是这样子的

……
    $.ajax({
        url: path+"/**",
        //timeout: 8000,
        cache: false,
        type: "post",
        dataType: "json/html",
        data: {"txtReal": tr,"txtCard": tc,"txtPhone": tp,"txtPhoneCode": tpcod},  //`adm:reg20160616`,"txtPhone","txtPhoneCode"
        error: function(d){
            alert("error");
            alert(curpath);
            alert($("#txtReal").val());
            alert(tc);
            alert(tp);
            alert(tpcod);
        },
        success: function (d, s, r) {
            if(d){
                if(d.status==0){
                    $.jBox.tip(d.message,"fail");
                }else{
                    window.location.href="/member/bank/bindingAccount";
                }
            }
        }        
    });

……

为了能随时复制测试,用以下代码来写

再现一次ajax请求,以下仅提供截图。

$(function()

{

$.ajax(

{

url:location.href,

dataType:‘json‘,

type:‘post‘,

data:{action:‘_yundanran-all-cat‘},

beforeSend:function()

{

console.log(‘beforeSend‘);

},

success:function()

{

console.log(‘success‘);

},

error:function()

{

console.log(‘error‘);

},

complete:function()

{

console.log(‘complete‘);

}

});

});

您可以复制这一段代码到控制台运行试试,返回的结果是这样的:

如图红色选择的区域,出现error,说明jquery的ajax请求失败,失败的代码是textstatus:parsererror,那么我们可以看下实际的请求是怎样的:

技术分享

如果红色的标记,请求状态是200,表明请求成功,并且已经正确发送了参数action。看下返回的结果是怎样的:

技术分享

返回的结果确实是对的。

这样就很奇怪了,明确ajax请求正确,并且正确的返回了内容。但jquery的ajax函数里却判断的是错误的请求。并且这种怪现象是从昨晚(2012年11月6日)开始的,之前一直很正常的。

3、解决方案

  • 1、删除后台程序的输出部分

 

  • 2、在ajax的输出结尾加上exit();防止输出额外内容。

如:

// json格式头信息

header("Content-Type: application/json");

// 输出json内容

echo json_encode($json);

// exit结束程序运行

exit;

 

转载自:http://qianduanblog.com/post/jquery-ajax-status-success-200.html

 

技术分享

Ajax的status值说明

1、status=304

304不是错误,304是服务器告诉你,你请求的这个url,内容没有变化,浏览器可以直接使用本地缓存,避免浪费网络流量,提高用户响应速度

因为ajax请求的时候如果使用get方式请求,同时路径参数相同的时候,ajax会先从本地缓存中取,如果取到了它是不会去请求后台的

如果要避免得到304响应,可以在请求的url添加一个随机参数,如js代码:
url = url + "&" + new Date();

2、status=302


    $.ajax({
        url: curpath+"/regFinal",
        //timeout: 8000,
        cache: false,
        type: "post",
        dataType: "json/html",
        data: {"txtReal": tr,"txtCard": tc,"txtPhone": tp,"txtPhoneCode": tpcod},  //`adm:reg20160616`,"txtPhone","txtPhoneCode"
…………

当服务器将302响应发给浏览器时,浏览器并不是直接进行ajax回调处理,而是先执行302重定向——从Response Headers中读取Location信息,然后向Location中的Url发出请求,在收到这个请求的响应后才会进行ajax回调处理。大致流程如 下:

ajax -> browser -> server -> 302 -> browser(redirect) -> server -> browser -> ajax callback

而在我们的测试程序中,由于302返回的重定向URL在服务器上没有相应的处理程序,所以在ajax回调函数中得到的是404状态码;如果存在对应的URL,得到的状态码就是200。

所以,如果你想在ajax请求中根据302响应通过location.href进行重定向是不可行的。

    可以继续用ajax,修改服务器端代码,将原来的302响应改为json响应,

 

3、status=200

状态码为200表示成功获取资源。

当浏览器第一次加载资源的时候,返回一般为200,意思是成功获取资源,并会在浏览器的缓存中记录下max-age,第二次访问的时候:
如果只是用浏览器打开,那么浏览器会去判断这个资源在缓存里有没有,如果有的话,会去判断max-age,看看过期没有,如果没有过期,则直接读缓存,根本不会和服务器进行交互,换句话说,断网都能打开,就和本地跑一样!如果已经过期了,那就去服务器请求,等待服务器响应,这是很费时间的,服务器如果发现资源没有改变过,那么就会返回304,告诉浏览器,我没变过,你去读缓存吧,于是浏览器也不用从服务器拉数据了,然而,等待服务器响应也是一个很要命的问题,在网速发达的今天,等一个响应,有时比下载还慢。
如果是用浏览器刷新的,那么浏览器不会去判断max-age了,直接去服务器拿,如果服务器判断资源没变过,则还是会返回304,和上面是一样的,所以刷新一下,其实很可怕,等于把所有的资源都要去服务器请求一边,问问服务器我过期了没有。
综上,尽量减少网页的资源数量!尽量合并JS CSS 图片!响应速度将会猛增!
当今,响应速度比网速重要!!

 

 

撰写日期:2016-6-17 15:59:25

Code笔记 之:ajax诡异的错误-请求status为200

标签:

原文地址:http://www.cnblogs.com/942267027wzmblog/p/5594299.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!