3

わかりました、スリムphpで構築されたAPIにユーザーデータを投稿するajax呼び出しからJSONをデコードできないようです..

これは私の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) は効果がないため、デコードできないようです。

どんな助けでも大歓迎です、ありがとう。

4

3 に答える 3

3

試す

$params_str = urldecode($requestBody);
parse_str($params_str, $params_arr);
$user = json_decode($params_arr['user']);
于 2012-10-30T17:23:05.947 に答える
2

あなたは間違っています...あなたはポスト経由でデータを送信しているので、リクエストボディを手動で読み取ろうとする代わりに、そこから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?");
  }
});
于 2012-10-30T17:41:13.720 に答える
0

問題は「ユーザー」キーでした。json デコード用に正しくフォーマットされていませんでした。とにかく必要ないので、これを完全に削除しました。

だから私は変更しました:

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

 data: JSON.stringify(jsonData)

そして、 @air4x 行も実装しました:

$json_a = json_decode(urldecode($requestBody));
于 2012-10-30T17:49:51.840 に答える