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