2012-10-30 51 views
3

好吧,我似乎無法將JSON從我的Ajax調用,用戶數據的帖子我的API,它是建立在超薄PHP解碼..Ajax + JSON解碼+ Slim PHP問題?

這是我的AJAX ..

var jsonData; 
jsonData = [ 
     { 
     username: "user", 
     password: "pass" 
     } 
    ]; 

$.ajax({ 
    type: "POST", 
    url: "http://localhost/api/user/auth", 
    data: { 
    user: JSON.stringify(jsonData) 
    }, 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: function(data) { 
    alert("You are good!"); 
    }, 
    error: function(xhr, type) { 
    alert("Y U NO WORK?"); 
    } 
}); 

這是我的SLIM PHP代碼..

$app->post('/user/auth', function() use ($app) { 
    try { 
     $requestBody = $app->request()->getBody(); //This works 

     //RequestBody is: user=%5B%7B%22username%22%3A%22user%22%2C%22password%22%3A%22pass%22%7D%5D   

     $json_a = json_decode($requestBody); //This doesn't work 

     print_r($json_a); //Has no output? 

     $username = $json_a['user']['username']; //Therefore this doesn't work? 

    } catch(Exception $e) { 
     echo '{"error":{"text": "'. $e->getMessage() .'"}}'; 
    } 
}); 

正如你可以在註釋中看到,寫在代碼中,requestBody等於:

user=%5B%7B%22username%22%3A%22user%22%2C%22password%22%3A%22pass%22%7D%5D 

但是,我似乎無法解碼它,因爲print_r($ json_a)沒有效果。

任何幫助非常感謝,謝謝。

+0

我認爲這只是在JavaScript –

回答

3

嘗試

$params_str = urldecode($requestBody); 
parse_str($params_str, $params_arr); 
$user = json_decode($params_arr['user']); 
+0

我的目標恐怕這沒有奏效。 urldecode已將字符串轉換回「user = [{」username「:」user「,」password「:」pass「}]」,但json decode還沒有將其轉換爲數組或任何東西? print_r($ json_a)仍然不返回任何內容。 hmmm:/ – Danny

+1

開始的關鍵'user ='正在妨礙你。你能否在ajax請求的數據部分傳遞另外一個變量,並顯示'$ requestBody'的外觀。 – air4x

2

youre做是錯誤的...你是通過郵寄發送的數據,所以你shoudl搶JSON字符串的從那裏而不是試圖手動讀取請求體...像

$req = $app->request(); 
$json = json_decode($req->post('user')); 

現在,如果你真的想發送一個JSON請求體,這是一個完全不同的事情,但它會需要改變你的JS。您需要將processData設置爲false,以便它不會嘗試在內部對data值進行編碼。這也意味着您必須對其進行預編碼:

$.ajax({ 
    type: "POST", 
    url: "http://localhost/api/user/auth", 
    data: JSON.stringify({user: jsonData}), // gotta strinigfy the entire hash 
    processData: false, 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: function(data) { 
    alert("You are good!"); 
    }, 
    error: function(xhr, type) { 
    alert("Y U NO WORK?"); 
    } 
}); 
0

問題在於「用戶」鍵。它沒有正確格式化json解碼。我完全刪除了它,因爲它不是必需的。

因此,我改變:

data: { 
    user: JSON.stringify(jsonData) 
    }, 

data: JSON.stringify(jsonData) 

而且,我還實施了@ air4x行:

$json_a = json_decode(urldecode($requestBody)); 
+1

我認爲它應該只是'data:JSON.stringify(jsonData)'。對象應該包含'key:value'對。你沒有從中得到語法錯誤嗎? – Barmar

+0

是的,你是正確的,我忘了刪除我的答案(我現在已經完成)括號。在我的代碼中,我實際上只是用數據編寫它:JSON.stringify(jsonData) – Danny