0

我正在使用 HTML、jQuery Mobile、jQuery 和 Cordova 创建一个应用程序。我的要求是通过调用远程服务器对应用程序中的用户进行身份验证。我正在开发我的本地主机 WAMP 堆栈。

我的 jQuery 如下。

$.ajax({
    type: 'POST',
    url: 'http://localhost/server/',
    crossDomain: true,
    data:{appkey:'1234567',action:'authenticate', username: u, password :p},
    dataType: 'jsonp',
    async: true,
    success: function (data){
        console.log(data);
     },
     error: function (jqXHR, textStatus, errorThrown) {
         alert("Invalid Username or Password");
         window.location = "index.html";
     }
});

远程调用网址如下。由于数据类型是 jsonp,JQuery 会自动将 ?callback= 添加到远程 url,这很好。

localhost/server/?callback=jQuery18306688079617451876_1383495199431…4567&action=authenticate&username=fdf&password=fdfdf&_=1383495208981

来自远程 url 的响应在 Chrome 开发者控制台中如下所示。

{"success":"false"}

在服务器的 PHP 部分,我使用以下代码返回 json 对象。

header('Content-type: application/json');
echo json_encode($araryVal);

在我看来,一切都很完美,但我的代码断点从未到达 ajax 调用的成功部分。它总是在错误部分爆发。

在开发人员控制台中,我看到了错误消息。

Uncaught SyntaxError: Unexpected token :

JsonLint 说 json 是有效的。请让我知道我在做什么傻。

4

2 回答 2

2

我不认为您的数据类型是 JSONP,它只是 JSON。如果是 JSONP,您的内容类型应该是“application/javascript”,并且您的响应文本应该使用回调参数中提供给服务器的 javascript 函数来包装它返回的 JSON 对象。

(实际上您的错误可能是 PHP 发出有关未定义变量的通知:araryVal ...您确定不应该是 arrayVal 吗?:)

于 2013-11-03T17:16:32.790 回答
1

我已经接受了@Fabio 提供的答案。我只想提供解决我问题的技术细节。

Fabio 的提示帮助我对此进行了一些研究。谢啦。

我已将回调选项添加到 ajax 调用中,如下所示。

$.ajax({
    type: 'POST',
    url: 'http://localhost/server/',
    crossDomain: true,
    data:{appkey:'1234567',action:'authenticate', username: u, password :p},
    dataType: 'jsonp',
    contentType: "application/javascript",
    jsonp: 'callback',
    jsonpCallback: 'mycallback',
    async: true,
    success: function (data){
        console.log(data);
     },
     error: function (jqXHR, textStatus, errorThrown) {
         alert("Invalid Username or Password");
         window.location = "index.html";
     }
});

上述更改后的远程调用 url 如下所示。JQuery 现在为回调参数添加“mycallback”而不是一些随机回调值“jQuery18306688079617451876_1383495199431…4567”。

localhost/server/?callback=mycallback&action=authenticate&username=fdf&password=fdfdf&_=1383495208981

在 PHP 端,我修改了输出以包含带有 json 字符串的回调值。

header('Content-type: application/javascript');
echo "mycallback(" . json_encode($araryVal) . ")";

今天是我了解如何将 jsonp 与回调一起使用的日子。谢谢大家。

于 2013-11-03T18:04:58.680 回答