关键词搜索

源码搜索 ×
×

PhoneGap:JS跨域请求

发布2014-08-05浏览7097次

详情内容

PhoneGap开发,理论上好处多多。但因为javascript是其中的主角,并且是直接存放于手机,跟服务器数据交互,就会有一个跨域访问的问题。

当然,这个问题肯定有解决方案,不然的话,这种利用PhoneGap等的混合APP模式就没有存在的价值。

网上的方案有很多,比如获取数据,可以采用Jsonp。

但提交数据呢?

首先可以在服务器端做一些配置,允许跨域请求。比如,对于ASP.NET开发的网站,可以修改web.config,加上:

web.config:

  1. <system.webServer>
  2. <httpProtocol>
  3. <customHeaders>
  4. <add name="Access-Control-Allow-Methods" value="OPTIONS,POST,GET"/>
  5. <add name="Access-Control-Allow-Headers" value="x-requested-with,content-type"/>
  6. <add name="Access-Control-Allow-Origin" value="*" />
  7. </customHeaders>
  8. </httpProtocol>
  9. </system.webServer>

然后是客户端JS:

  1. $(function () {
  2. $("#divHello").html("Hello PhoneGap");
  3. forServer();
  4. });
  5. var ashx = "http://10.69.25.132/test.ashx";
  6. function forServer(){
  7. var xhr;
  8. xhr = new XMLHttpRequest();
  9. if (xhr){
  10. xhr.onerror = function(){alert("错误");};
  11. //xhr.timeout = 60000;//IE9加上这个属性会报错,不知道为什么,其他版本未测试
  12. xhr.ontimeout = function(){alert("超时");};
  13. xhr.onload = function(){
  14. var data = $.parseJSON(xhr.responseText);
  15. $("#divData").html(data.data);
  16. };
  17. xhr.open("post", ashx,true);
  18. xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
  19. xhr.send("p1=guangzhou tianhe");
  20. }
  21. else{
  22. alert("Failed to create");
  23. }
  24. }

服务器端test.ashx

  1. public class test1 : IHttpHandler
  2. {
  3. public void ProcessRequest(HttpContext context)
  4. {
  5. context.Response.ContentType = "application/json";
  6. context.Response.Charset = "utf-8";
  7. string res = String.Format(@"{{""data"":""{0}""}}",
  8. context.Request.Form["p1"]
  9. );
  10. context.Response.Write(res);
  11. }
  12. public bool IsReusable
  13. {
  14. get
  15. {
  16. return false;
  17. }
  18. }
  19. }

经验总结:

1、$.getJSON()的方式,Chrome下可以,IE死活不行,在IE浏览器下,按F12查看,根本没有连接指定的.ashx,直接拒绝。改用XMLHttpRequest,两种浏览器都能接受。放在安卓手机模拟器里也能正常运行

2、形如 http://localhost:8088/test.ashx 这种方式,在安卓手机模拟器里是连不上的,要改成IP或域名:http://192.168.10.1:8088/test.ashx

3、JS禁止跨域,不是为了保护被访问的服务器,而是为了保护使用浏览器的用户。只要想想木马、弹窗广告、居心叵测的信息收集,就会明白

4、$.getJSON(),IE不支持跨域访问,只能用XMLHttpRequest。有文章说IE8和IE9要使用  XDomainRequest  ,但其实貌似很是不行(再次鄙视微软,不知道为什么会搞出IE这种怪物,左摇右摆,到处是版本兼容问题,让人抓狂。)
  1. function getData(){
  2. $.getJSON(
  3. ashx
  4. ,{"uid" : Date()}
  5. ,function(data) {
  6. $("#divData").html(data.data);
  7. });
  8. }





相关技术文章

最新源码

下载排行榜

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载