我正在为 Android 创建 PhoneGap 应用程序。为了从(远程)服务器获取数据,我使用 jQuery 的 $.ajax() 函数进行 REST 调用。有几件事你必须知道:
- 调用类型必须为 POST
- 服务器需要 JSON 数据(至少用户名和密码)
- 服务器发回 JSON 数据
代码:
function makeCall(){
var url = "http://remote/server/rest/call";
var jsonData ='{"username":"'+$('#username').val()+'","password":"'+$('#password').val()+'"}';
$.ajax({
headers: {"Content-Type":"application/json; charset=UTF-8"},
type: "POST",
url: url,
data: jsonData,
dataType: "json",
success: succesFunction,
error: errorFunction
});
}
但是,这行不通。当我使用 Firebug 查看服务器响应时,什么也没有。使用 TcpTrace 我可以看到请求的 header 。有一个 OPTIONS 方法,而不是预期的 POST 方法,并添加了一些奇怪的 header 。
OPTIONS /remote/server/rest/call HTTP/1.1
Host: localhost:8081
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:11.0) Gecko/20100101 Firefox/11.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: nl,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Origin: null
Access-Control-Request-Method: POST
Access-Control-Request-Headers: content-type
Pragma: no-cache
Cache-Control: no-cache
我知道这和跨域请求有关,但我不知道如何解决这个问题。我尝试了一些方法来修复它,但没有结果:
- 使用“jsonp”代替“json”
- 尝试使用Cross-Origin Resource Sharing (CORS)
该问题也与同源策略有关,但这不适用于 PhoneGap 用于加载本地 html 文件的 file://协议(protocol)。
在我的 AndroidManifest.xml 文件中,选项
<uses-permission android:name="android.permission.INTERNET" />
已设置。
我已经尝试解决这个问题两天了,但到目前为止还没有结果。这可能吗?您有什么建议可以帮助我继续前进吗?
提前致谢!
最佳答案
您需要将您的外部域列入白名单。只需转到 Xcode 中的phonegap/cordova plist 文件并添加一个新条目,将其值为 *,您就可以访问那里的任何网站。
还知道这在浏览器中不起作用。浏览器存在跨域问题,而不是电话间隙或移动设备。
关于jquery - 使用PhoneGap和jQuery的跨域请求不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10173427/