我正在使用 PhoneGap 开发移动应用程序,我必须从另一个项目访问一些服务。 我使用 jquery-2.0.0.js 和 jquery-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="*" />
我可能会出错!
答案 0 :(得分:8)
问题是您的phonegap应用程序正在从不是Web服务器的东西请求本地文件。本地文件随NO HTTP HEADERS一起提供 - 这意味着没有“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表示true。像这样:
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;
}
});
Cordova / Phonegap中的Ajax - 耶!
答案 1 :(得分:2)
你的查询的网址是 localhost ,意思是 - 相同的设备(android模拟器或物理)。我确定这是你的问题。您应该使用api json服务器的IP(或域),可能是192.168.1.1(取决于您的网络配置)
答案 2 :(得分:0)
您使用的是物理设备还是模拟器? iOS? Android?
我可能错了,但如果您在移动设备上运行应用程序,则无法访问本地主机。
答案 3 :(得分:0)
我通过“GET”调用解决了问题,但现在我正在尝试进行“PUT”调用,这是同样的问题,总是失败。
$.ajax({
url: '/echo/html/',
type: 'PUT',
data: "email=a@b.com",
success: function(data) {
alert('Success.');
}
});
答案 4 :(得分:0)
如果您的手机无法访问url: 'http://localhost:62465/api/account?email=johndoe@yahoo.com'
,则可以使用非常有用的技巧。
使用www.ngrok.com
,您可以将Internet域分配给本地无法访问的端口。
只需注册,获取访问令牌,然后您就可以使用:
ngrok -authtoken myauthtoken -subdomain=mysubdomainname 62465
然后,您可以使用网址http://mysubdomainname.ngrok.com/api/account?email=johndoe@yahoo.com
答案 5 :(得分: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);
}