在AJAX中清空PHP响应对象,但仅在成功时

时间:2017-08-24 21:28:33

标签: php jquery ajax slim slim-3

要从我的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.                
}

2 个答案:

答案 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);