要从我的PHP服务器接收我的响应对象,我在下面有代码。
首先,它有效。不起作用的是,如果满足我的第一个PHP条件,我的Ajax中的success函数会正确响应,但只能不使用data
对象。
这是我的AJAX功能:
$.ajax({
type: "PUT",
url: "http://server/register",
contentType: "application/json",
data: '{"username":"' + username + '", "password":"' + password + '"}',
success: function(data) {
console.log(data) // The output in my dev tools under Firefox is just a blank line, no error message or even "undefined".
console.log("Success") // Works!
if(data.status == 200){
console.log("Test 1") // Doesn't work. Although status code 200 is shown to me.
}
},
error: function(data) {
console.log(data) // This works! I can see the content of the object. The correct status code (409) is shown to me.
if(data.status == 409){
console.log("Test 2") // Works
}
}
});
这是我的PHP函数:
public function register($request, $response)
{
...
if(condition-1) {
echo("Condition 1 works!"); // Works.
return $response->withStatus(200);
} elseif(condition-2) {
echo("Condition 2 works!"); // Works too.
return $response->withStatus(409);
}
}
我不明白为什么没有data
个对象。我正在使用Slim 3 Framework,可能会返回一个像这样的JSON对象:
$content = ["foo" => 'bar', ...] ; //Any data you wish to return
return $response->withJson($content);
但到目前为止,我的整个代码在不使用JSON对象的情况下工作。即使我var_dump $response
对象,我也可以看到它在服务器端就在那里。
if(condition-1) {
var_dump($response->withStatus(200)); // Works. I can see it.
}
答案 0 :(得分:3)
这里有很多错误,所以我尽力指出我看错了什么,并希望通过改变我建议你会有所成功。
如果你试图在你的ajax成功函数中使用data.status,那么看起来你认为你正在返回json,但你不是。即使你是,你也会通过回应“条件1工作!”来破坏它。
所以想一想,如果你有这样的json响应:
{'a':'1'}
你在它之前回应了一些东西,你的反应已经破坏了,看起来像这样:
Condition 1 works!{'a':'1'}
如果PHP以您的方式引发错误,则会发生相同的损坏,因此请注意这一点。
您还应该为ajax请求声明一个dataType,所以:
$.ajax({
type: "PUT",
url: "http://server/register",
contentType: "application/json",
data: JSON.stringify({
"username": username,
"password": password
}),
dataType: 'json', // <-- THIS LINE IS IMPORTANT
success: function(data, textStatus, jqXHR) {
// ...
},
error: function(jqXHR, textStatus, errorThrown) {
// ...
}
});
注意:您是单引号数据对象,因此您正在以艰难的方式进行操作。就像我做的那样在JS对象上使用JSON.stringify!
由于我的代码需要json响应,请务必在此处查看其他答案,因为它显示了如何使用slim发回适当的json响应。
最后,在你的ajax成功函数中,data.status永远不可用。 jQuery的文档显示有三个参数(data, textStatus, jqXHR)
,数据专门用于数据,而不是HTTP状态代码或任何标题。
我整理了一个迷你Slim应用程序的完整工作示例。它已经过全面测试和工作(它不是很棒,所以不要笑):
<?php
use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;
require 'vendor/autoload.php';
$app = new \Slim\App;
$app->get('/', function (Request $request, Response $response) {
$response->getBody()->write('<!doctype html>
<html>
<head>
<script
src="https://code.jquery.com/jquery-3.2.1.min.js"
integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4="
crossorigin="anonymous"></script>
<script>
$(document).ready(function(){
$("p").on("click", function(){
var username = "kookoopapa";
var password = "gr3atp4ssWerd";
$.ajax({
type: "PUT",
url: "/register",
data: JSON.stringify({
"username": username,
"password": password
}),
contentType: "application/json",
dataType: "json", // <-- THIS LINE IS IMPORTANT
success: function(data, textStatus, jqXHR) {
alert( data.a );
alert( data.b );
},
error: function(jqXHR, textStatus, errorThrown) {
// ...
}
});
});
});
</script>
</head>
<body>
<p>Click</p>
</body>
</html>');
return $response;
});
$app->put('/register', function (Request $request, Response $response) {
$php_input = file_get_contents('php://input');
$vars = json_decode( $php_input, TRUE );
$content = [
'a' => $vars['username'],
'b' => $vars['password']
];
return $response->withStatus(200)->withJson($content);
});
$app->run();
答案 1 :(得分:1)
尝试使用以下返回:
$content = ["foo" => 'bar', ...] ; //Any data you wish to return
return $response->withStatus(200)->withJson($content);