2017-07-11 26 views
1

這裏是我的AJAX調用代碼:阿賈克斯的錯誤:函數調用,即使請求狀態是200

var name = $('#name').val(); 
var email = $('#email').val(); 
var password = $('#password').val(); 
$.ajax({ 
    type: 'POST', 
    url: 'ajax.php', 
    cache: false, 
    data: { json : JSON.stringify({ 
     name:name, 
     email:email, 
     password:password 
    })}, 
    dataType: 'json', 

    success: function(){ 
     alert('request successful'); 
    }, 

    error: function(){ 
     alert('error occured'); 
    } 

}); 

請求的狀態是200,但誤差函數被調用所有的時間。

有誰知道,

  • 這是爲什麼?
  • 我該如何解決?
+0

如果請求的工作可能出現這種情況,但deserialisation解碼失敗。如果你真的使用控制檯調試了這個,並且傳遞給'error'處理函數的參數,你可以得到錯誤信息來診斷。 –

+0

你能顯示你正在收到的回覆嗎?似乎你沒有以json格式設置響應。您不需要在Ajax調用數據中使用'JSON.stringify' –

+0

@PankajMakwana *「您不需要在Ajax調用數據中使用'JSON.stringify'」* < - 如果他們想要發佈json字段的JSON字符串值。 – Phil

回答

2

最有可能的問題是在這一行:dataType: 'json',因爲它期待JSON響應,並且您正在發送html或文本文本響應。讓我們來看看定義第一:

  • JSON.stringify變成一個JavaScript對象轉換爲JSON文本並存儲JSON文本字符串。

  • contentType是發送到服務器的標題,指定特定的格式。

  • dataType你告訴jQuery期望什麼樣的響應。

例子:

如果要發佈這樣的:{"name":"John Doe"}並期待回:{"success":true}

那麼你應該有:

var data = {"name":"John Doe"}; 
dataType : "json", 
contentType: "application/json; charset=utf-8", 
data : JSON.stringify(data), 

瞭解更多詳情:Check jQuery Docs

解決方案1:(測試)

  • 只是刪除dataType: 'json',線和讓jQuery的決定數據類型。(的確有不錯的工作在確定),或者確保在使用兩側正確的數據類型(客戶端和服務器)

解決方案2:(測試)

的jQuery:

var name = $('#name').val(); 
var email = $('#email').val(); 
var password = $('#password').val(); 
$.ajax({ 
    type: 'POST', 
    url: 'ajax.php', 
    dataType : "html", //assuming you need html response like '<div>Success</div>' 
         //Common types: html, xml, json & text 
    cache: false, 
    data: { json : encodeURIComponent(JSON.stringify({ 
     name:name, 
     email:email, 
     password:password 
    }))}, 


    success: function(){ 
     alert('request successful'); 
    }, 

    error: function(){ 
     alert('error occured'); 
    } 

}); 

PHP:

$json_data = json_decode(urldecode($_POST['json'])); 
//now $json_data variable has decoded JSON data 
echo $json_data->name; 

解決方案3:(未測試)

發送JSON對象通過設置contentType:像

contentType: "application/json; charset=utf-8", 

然後讀取使用php://input注意原始輸入:$〇一二三六八六〇三八二〇九〇五〇八四一二三二一〇不會在這裏工作)

以下是操作方法:

  • 在PHP文件
    • 集內容類型獲取數據$input = file_get_contents('php://input');
    • 解碼數據$decoded_input = urldecode($input);
    • 最後,作爲JSON對象$data = json_decode($input);
  • +0

    a)你不需要在jQuery中使用'encodeURIComponent',它可以爲你做到這一點,所以你最終只需要對數據進行雙重編碼。 b)你應該**從不**必須在'$ _POST'或'$ _GET'屬性上使用'urldecode'。來自請求的任何數據已經被解碼 – Phil

    +0

    @Phil也許你是對的。但是數據像服務器上的json字符串一樣。所以,我添加'encodeURIComponent'進行編碼,並在服務器端數據未解碼,所以我使用'urldecode'順便說一句,我不確定OP是否需要編碼。 –

    +0

    @Atlas_Gondal這就是我一直在尋找的東西。謝謝:) – Alena