Code筆記 之:ajax詭異的錯誤-請求status為200


Ajax測試:打印出接收到的數據

詭異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響應,比如下面的ASP.NET MVC示例代碼:

return Json(new { status = 302, location = "/oauth/respond" });

ajax代碼稍作修改即可:

復制代碼
$.ajax({
    url: '/oauth/respond', type: 'post', data: data, dataType: 'json', success: function (data) { if (data.status == 302) { location.href = data.location; } } }); 
復制代碼

【方法二】

 不用ajax,改用form。 

<form method="post" action="/oauth/respond"> </form>

 

3、status=200

狀態碼為200表示成功獲取資源。

當瀏覽器第一次加載資源的時候,返回一般為200,意思是成功獲取資源,並會在瀏覽器的緩存中記錄下max-age,第二次訪問的時候:
如果只是用瀏覽器打開,那么瀏覽器會去判斷這個資源在緩存里有沒有,如果有的話,會去判斷max-age,看看過期沒有,如果沒有過期,則直接讀緩存,根本不會和服務器進行交互,換句話說,斷網都能打開,就和本地跑一樣!如果已經過期了,那就去服務器請求,等待服務器響應,這是很費時間的,服務器如果發現資源沒有改變過,那么就會返回304,告訴瀏覽器,我沒變過,你去讀緩存吧,於是瀏覽器也不用從服務器拉數據了,然而,等待服務器響應也是一個很要命的問題,在網速發達的今天,等一個響應,有時比下載還慢。
如果是用瀏覽器刷新的,那么瀏覽器不會去判斷max-age了,直接去服務器拿,如果服務器判斷資源沒變過,則還是會返回304,和上面是一樣的,所以刷新一下,其實很可怕,等於把所有的資源都要去服務器請求一邊,問問服務器我過期了沒有。
綜上,盡量減少網頁的資源數量!盡量合並JS CSS 圖片!響應速度將會猛增!
當今,響應速度比網速重要!!

 

 

Ajax測試:打印出接收到的數據

 

PS:JavaScript測試-Ajax

  ajax傳遞參數到后台,使用json類型(dataType:json)返回

   若想知道,鏈接或返回錯誤在后台什么位置出現的,可以簡單些一段測試代碼逐步運行測試

   測試代碼(PHP語言)可以是這樣,比如:

  方法一:

    直接在PHP代碼中使用  print_r($data);或print($data);

    然后,在html頁面中使用 ajax 接收

    $.ajax({      

      url: "你的方法url",

      data: 'str='+str+'&str1='+str1+…………,

      dataType: "json",

      type: "post",

      cache: false,

      error: function(){ alert("error~"); },

      success: function(d){

        alert(d);

      }

    });

  方法二:

   if(true){

    $json['status']=0;

    $json['message']="代碼已運行至此~~";

    echo json_endecode($json);

    exit; 

   }

     html頁面前台反饋代碼是這樣:

    $.ajax({

      url: "你的方法url",

      data: {'str':str,str1:str1,…………},

      dataType: "json",

      type: "post",

      cache: false,

      error: function(){ alert("error~"); },

      success: function(d){

        alert(d.status + d.message);

        //alert(d.message);

      }

    });

 

 

 

--------------------------------------------------------------

由於個人對技術知識的表達不是很專業,還望各位看官

多多見諒,多多評論,多多指導!

不吝賜教~(~_~)

---------------------------------------------------------------

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

更新時間:2016-6-20 11:24:04


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM