【问题标题】:Ajax + JSON Decode + Slim PHP problems?Ajax + JSON 解码 + Slim PHP 问题?
【发布时间】:2012-10-20 02:37:14
【问题描述】:

好吧,我似乎无法从我的 ajax 调用中解码 JSON,该调用将用户数据发布到我的 api,该 api 内置在 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() .'"}}';
    }
});

正如您在 cmets 中看到的,在代码中编写的 requestBody 等于:

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

但是,我似乎无法解码它,因为 print_r($json_a) 没有效果。

非常感谢任何帮助,谢谢。

【问题讨论】:

  • 我认为这只是javascript中的一个对象

标签: php javascript ajax json zepto


【解决方案1】:

您做错了...您正在通过帖子发送数据,因此您应该从那里获取 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?");
  }
});

【讨论】:

    【解决方案2】:

    问题出在“用户”键上。 json 解码的格式不正确。我完全删除了它,因为无论如何都没有必要。

    所以我改变了:

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

     data: JSON.stringify(jsonData)
    

    而且,我还实现了@air4x 行:

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

    【讨论】:

    • 我认为应该只是data: JSON.stringify(jsonData)。对象应包含key: value 对。你不会从中得到语法错误吗?
    • 是的,你是对的,我忘了删除答案中的括号(我现在已经完成了)。在我的代码中,我实际上只用数据编写了它: JSON.stringify(jsonData)
    【解决方案3】:

    试试

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

    【讨论】:

    • 恐怕这行不通。 urldecode 已将字符串转换回 "user=[{"username":"user","password":"pass"}]",但是 json decode 没有将其转换为数组或任何东西? print_r($json_a) 仍然没有返回任何内容。嗯:/
    • 一开始的关键user= 会妨碍您。您能否在 ajax 请求的数据部分再传递一个变量并显示 $requestBody 的外观。
    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    • 2018-08-14
    • 1970-01-01
    • 2017-02-14
    相关资源
    最近更新 更多