好吧我似乎无法从我的ajax调用中解码JSON,它将用户数据发布到我的api,它是用精简的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 :(得分:3)
尝试
$params_str = urldecode($requestBody);
parse_str($params_str, $params_arr);
$user = json_decode($params_arr['user']);
答案 1 :(得分: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?");
}
});
答案 2 :(得分:0)
问题是“用户”键。它没有正确格式化为json解码。我完全删除了它,因为它无论如何都没有必要。
所以我改变了:
data: {
user: JSON.stringify(jsonData)
},
到
data: JSON.stringify(jsonData)
而且,我还实施了@ air4x系列:
$json_a = json_decode(urldecode($requestBody));