0

我正在开发一个以 JSON 形式返回数据的 PHP Web 服务。我现在正在使用 jQuery/javascript 文件测试 Web 服务。它似乎正在正确地进行调用和接收数据,但来自服务器的返回值似乎有太多的双引号。

PHP:

public static function getToken($username, $password)
        {
            $token = AuthenticationController::authenticate($username, $password);

            if ($token)
            {
                $user = AuthenticationController::getUserFromToken($token);

                if (UserController::userIsVerified($user->id))
                {
                    $t = array('token' => $token);

                    return json_encode($t);
                }

                return json_encode(array('error' => 'This account has not been verified. Check email and click the provided link to verify the account.'));
            }

            return json_encode(array('error' => 'Authentication failed.'));
        }

JS:

req.done(function(msg)
        {
            if (msg.error)
            {
                error = true;
                message = msg.error;
            }
            else if (msg.message)
            {
                message = msg.message;
            }
            else if (msg.token)
            {
                token = msg.token;
            }
            else 
            {
                error = true;
                message = "An unknown error has occured.";
            }
        });

一方面,该msg对象不是以 JSON 对象的形式返回,而是以字符串的形式出现,因此我必须对其进行$.parseJSON(msg)处理。您在下面看到的,token 变量最终写成“mylongtoken”(包括引号)。如果您在 firebug 中查看该变量,它就像这样:“mylongtoken”。这只是默认行为,我需要去掉引号吗?

4

1 回答 1

1

首先,要让 jquery 将您的响应解析为 json,您必须返回适当的内容类型。application/json似乎合适。

为了增加安全性,您可以添加X-Content-Type-Options: nosniff以防止浏览器被欺骗将您的 JSON 作为普通页面读取以尝试任何可能启用 HTML 解析和 XSS 的内容嗅探:

其次,如果您得到两组引号,那么您编写的代码确实会添加它们。json_encode() 不会:

echo json_encode(array('token' => 'tokenstring');将输出{"token":"tokenstring"}- 没有周围的引号。任何字符串中的任何引号都将使用反斜杠进行转义。

于 2012-10-08T19:24:26.350 回答