2

我正在使用PhoneGap开发一个移动应用程序,并且我必须从另一个项目访问一些服务。我正在使用jquery-2.0.0.jsjquery-mobile-1.3.2.js

$.ajax({
            url: 'http://localhost:62465/api/account?email=johndoe@yahoo.com',
            dataType: 'json',
            success: function (data) {
                alert(data.Name);
            },
            error: function (xhr, type) {
                alert("Failed to load data");
                alert(xhr + " " + type);
            }
});

这个 ajax 调用每次都失败。在config.xml我有以下行:<access origin="*" />

我可能会出错的地方!

4

6 回答 6

9

问题是您的 phonegap 应用程序正在从非网络服务器请求本地文件。本地文件交付时没有 HTTP 标头 - 这意味着没有“200 OK”标头和“404 Not Found”错误。因此,假设状态码为 0。

直接的 javascript XHR 将需要忽略状态并在 readystate == 4(已完成并准备好)上执行您的操作。像这样:

    var myrequest = new XMLHttpRequest();
    myrequest.open('GET','localfile.html');
    myrequest.onreadystatechange = function(){
        if(myrequest.readyState == 4) {
            var result = myrequest.responseText;
        }
    }
    myrequest.send();

在 MooTools 中,在 Request 类中实现更改状态测试是一项相对简单的任务——将返回代码测试更改为也接受 0 表示真。像这样:

Request.implement({
    isSuccess: function(){
        var status = this.status;
        return ((status >= 200 && status < 300) || status === 0);
    }
});

jQuery....关于 jQuery,我有一些话想说——但我会保持沉默,因为这似乎是一个优雅的地方。

要为状态 == 0 准备 jQuery,您需要使用 always 事件而不是成功事件,您可以在那里测试状态代码。

$.ajax({
   url: '/echo/html/',
   type: 'PUT',
   data: "email=a@b.com"
 }).always(function(data, textStatus, jqXHR){
   switch(textStatus) {
     case 200:
         case 0:
         alert('Success.');
             break;
         case 404:
             alert('oops');
             break;
   }
 });

科尔多瓦/Phonegap 的阿贾克斯 - 耶!

于 2013-10-21T15:20:32.517 回答
2

您查询的 url 是localhost,这意味着 -相同的设备(android 模拟器或物理)。我确定这是你的问题。您应该使用 api json 服务器的 IP(或域),可能是 192.168.1.1(取决于您的网络配置)

于 2013-07-31T08:25:43.880 回答
0

您使用的是物理设备还是模拟器?IOS?安卓 ?

我可能是错的,但是如果您在移动设备上运行您的应用程序,您将无法访问您的本地主机。

于 2013-07-31T08:12:48.287 回答
0

我用“GET”调用解决了这个问题,但现在我正在尝试进行“PUT”调用,这是同样的问题,总是失败。

$.ajax({
   url: '/echo/html/',
   type: 'PUT',
   data: "email=a@b.com",
    success: function(data) {
         alert('Success.');
    }
 });
于 2013-08-01T13:34:41.157 回答
0

如果url: 'http://localhost:62465/api/account?email=johndoe@yahoo.com'无法从您的手机访问,则可以使用一个非常有用的技巧。

使用www.ngrok.com,您可以将 Internet 域分配给本地无法访问的端口。

只需注册,获取访问令牌,然后您就可以使用: ngrok -authtoken myauthtoken -subdomain=mysubdomainname 62465

然后你就可以通过 url 访问你的电脑了http://mysubdomainname.ngrok.com/api/account?email=johndoe@yahoo.com

于 2014-05-22T09:30:51.657 回答
0

(对于有类似问题的人)使用ajax错误知道什么是错误的:

    error: function(jqXHR, exception){          
        var msg = '';
        if (jqXHR.status === 0) {
            msg = 'Not connect.\n Verify Network.';
        } else if (jqXHR.status == 404) {
            msg = 'Requested page not found. [404]';
        } else if (jqXHR.status == 500) {
            msg = 'Internal Server Error [500].';
        } else if (exception === 'parsererror') {
            msg = 'Requested JSON parse failed.';
        } else if (exception === 'timeout') {
            msg = 'Time out error.';
        } else if (exception === 'abort') {
            msg = 'Ajax request aborted.';
        } else {
            msg = 'Uncaught Error.\n' + jqXHR.responseText;
        }
        console.log(msg);
    }
于 2016-02-14T16:39:47.653 回答