Phone Gap:JSドメイン横断要求

3046 ワード

Phone Gapの開発は、理論的な利点が多いです.しかし、javascriptはその中の主役であり、携帯電話に直接保存されているので、サーバのデータと対話して、ドメインをまたいで訪問する問題があります.
もちろん、この問題には解決策があるはずです.でないと、このようなPhone Gapなどを利用したハイブリッドアプリのモデルは存在する価値がありません.
インターネットのプログラムはたくさんあります.例えば、データを取得するなら、Jsonpを採用してもいいです.
データを提出しますか?
まず、サーバー側でいくつかの構成を行うことができ、ドメイン間の要求を許可する.例えば、ASP.NETが開発したウェブサイトに対して、web.com figを修正することができます.
web.com fig:
  <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.asx
    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;
            }
        }
    }
経験のまとめ:
1、$getJSON()の方式で、Chromeの下で、IEは死活することができなくて、IEブラウザの下で、F 12によって調べて、まったく指定のを接続していません.asx、直接拒絶します.XMLHttpRequestに変更すれば、両方のブラウザが使えます.アンドロイド携帯のシミュレータに入れても正常に動作します.
2、形が似ているhttp://localhost:8088/test.ashx このような方式は、Android携帯シミュレータでは接続できません.IPまたはドメイン名に変更します.http://192.168.10.1:8088/test.ashx
3、JSはドメインをまたぐことを禁止して、訪問されたサーバーを保護するためではなく、ブラウザを使用するユーザを保護するためです.木馬、パチンコ広告、下心がある情報収集を考えれば、分かります.
4、$getJSON()は、ドメインをまたぐアクセスはIEでサポートされておらず、XMLttpRequestのみを使用することができます.IE 8とIE 9は使うという記事があります. 
XDomainRequest ,しかし、実はとてもいけないようです.(マイクロソフトを再び軽蔑しています.なぜIEというモンスターができたのか分かりません.右に左に振れば、バージョンの互換性があり、気が狂います.)
function getData(){
	$.getJSON(
		ashx
		,{"uid" : Date()}
		,function(data) {
			$("#divData").html(data.data);
		});
}