自己構建Ajax請求進行模擬QueryTask進行查詢

孫群發表於2012-12-14

ArcGIS JS API中用Query和QueryTask進行查詢的時候其實是進行的Ajax請求,只不過是將該Ajax請求進行了封裝,更好的方便二次開發人員呼叫而已。有時候我們用QueryTask進行查詢的時候,傳的引數的資料可能比較大,比如query.geometry經過序列化後超過了2KB,那麼就需要執行post請求,這樣就會造成ajax的跨域訪問問題。一般的解決辦法是使用ArcGIS所提供的代理檔案proxy.jsp、proxy.ashx、proxy.php,使用的時候配置如下esri.config.defaults.io.proxyUrl = "http://samedomain:sameport/proxy/proxy.jsp",這樣在用各種Task進行ajax請求的時候,如果資料量超過2KB,就會自動使用代理,但是使用的前提是要將你進行查詢的地圖服務的url寫到proxy.jsp的serverUrls中(目的是為了進行檢驗要進行查詢的服務是否能夠使用代理),由於某些原因,我在使用的過程中不能將要查詢的服務地址放到代理檔案中,這樣就不能使用代理了。

如果不能使用代理,還可以通過jsonp的介面實現跨域訪問,首先我要獲取QueryTask在執行execute方法時所傳送的資料資訊,通過Chrome Developer Tools中的NetWork一項可以檢視詳細資訊,如下圖所示:



上圖中的紅色線框內的資料表示的就是所傳遞的資料,通過dojo.io.script可以用script標籤的形式訪問JSONP介面,將需要進行查詢的引數資訊手動進行設定,程式碼如下:

var xhrArgs = {
                url:queryUrl+"/query",
                handleAs:"json",
                callbackParamName:"callback",
                content:{
                    f:"json",
                    where:"",
                    returnGeometry:false,
                    spatialRel:"esriSpatialRelIntersects",
                    geometry:dojo.toJson(bufferGeometry.toJson()),
                    geometryType:"esriGeometryPolygon",
                    inSR:102100,
                    outFields:"鄉鎮名稱,鄉鎮人口",
                    outSR:102100
                }
            };

            //用dojo.io.script使用JSONP構建ajax請求
            var def = dojo.io.script.get(xhrArgs);

            def.then(dojo.hitch(this,function(featureSet){
                    alert("查詢完成!");
                }
            }),dojo.hitch(this,function(error){
                    alert("查詢完成!")
            }));

需要注意的是,使用服務端在封裝JSONP介面的時候,會使用不同的識別回撥函式的名稱,Esri使用的名稱是callback,所以在前端需要協商callbackParamName為callback,這樣在ArcGIS的Server端才會正確呼叫客戶端的回撥函式。以上就是用原生的Dojo模擬ArcGIS JS API中QueryTask的功能。

相關文章