PhoneGap:JS跨域請求

PhoneGap開發,理論上好處多多。但由於javascript是其中的主角,而且是直接存放於手機,跟服務器數據交互,就會有一個跨域訪問的問題。javascript

固然,這個問題確定有解決方案,否則的話,這種利用PhoneGap等的混合APP模式就沒有存在的價值。html

網上的方案有不少,好比獲取數據,能夠採用Jsonp。java

但提交數據呢?web

首先能夠在服務器端作一些配置,容許跨域請求。好比,對於ASP.NET開發的網站,能夠修改web.config,加上:json

web.config:跨域

  <system.webServer>
    <httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Methods" value="OPTIONS,POST,GET"/>
        <add name="Access-Control-Allow-Headers" value="x-requested-with,content-type"/>
        <add name="Access-Control-Allow-Origin" value="*" />
      </customHeaders>
    </httpProtocol>
  </system.webServer>

而後是客戶端JS:

$(function () {
	$("#divHello").html("Hello PhoneGap");
	forServer();
});  
var ashx = "http://10.69.25.132/test.ashx";
function forServer(){
	var xhr;
	xhr = new XMLHttpRequest();
	if (xhr){
		xhr.onerror = function(){alert("錯誤");};
		//xhr.timeout = 60000;//IE9加上這個屬性會報錯,不知道爲何,其餘版本未測試
		xhr.ontimeout = function(){alert("超時");};
		xhr.onload = function(){
			var data = $.parseJSON(xhr.responseText);
			$("#divData").html(data.data);
		};
		xhr.open("post", ashx,true);
		xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
		xhr.send("p1=guangzhou tianhe");
	}
	else{
		alert("Failed to create");
	}
}

服務器端test.ashx

    public class test1 : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "application/json";
            context.Response.Charset = "utf-8";
            string res = String.Format(@"{{""data"":""{0}""}}", 
                context.Request.Form["p1"]
                );
            context.Response.Write(res);
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }

經驗總結:瀏覽器

一、$.getJSON()的方式,Chrome下能夠,IE死活不行,在IE瀏覽器下,按F12查看,根本沒有鏈接指定的.ashx,直接拒絕。改用XMLHttpRequest,兩種瀏覽器都能接受。放在安卓手機模擬器裏也能正常運行服務器

二、形如 http://localhost:8088/test.ashx 這種方式,在安卓手機模擬器裏是連不上的,要改爲IP或域名:http://192.168.10.1:8088/test.ashxapp

三、JS禁止跨域,不是爲了保護被訪問的服務器,而是爲了保護使用瀏覽器的用戶。只要想一想木馬、彈窗廣告、居心叵測的信息收集,就會明白

四、$.getJSON(),IE不支持跨域訪問,只能用XMLHttpRequest。有文章說IE8和IE9要使用  XDomainRequest  ,但其實貌似非常不行(再次鄙視微軟,不知道爲何會搞出IE這種怪物,左搖右擺,處處是版本兼容問題,讓人抓狂。)
function getData(){
	$.getJSON(
		ashx
		,{"uid" : Date()}
		,function(data) {
			$("#divData").html(data.data);
		});
}
相關文章
相關標籤/搜索