自己構建Ajax請求進行模擬QueryTask進行查詢
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的功能。
相關文章
- AJAX(XMLHttpRequest)進行跨域請求方法詳解(一)XMLHTTP跨域
- AJAX(XMLHttpRequest)進行跨域請求方法詳解(二)XMLHTTP跨域
- AJAX(XMLHttpRequest)進行跨域請求方法詳解(三)XMLHTTP跨域
- AJAX(XMLHttpRequest)進行跨域請求方法詳解(四)XMLHTTP跨域
- HttpClient 進行soap請求HTTPclient
- 使用retrofit進行網路請求
- 使用 $fetch 進行 HTTP 請求HTTP
- JS進階系列 --- ajax請求優化JS優化
- Android 使用ksoap進行webservice請求AndroidWeb
- apisix~按域名進行請求轉發API
- ApacheSolr+PHP進行全文查詢ApacheSolrPHP
- 使用MDX進行環比查詢
- 對請求來源進行白名單限制
- 使用fidder進行post和get請求
- koa,koa-router進行資料模擬
- 使用KepServerEx進行資料模擬Server
- 【原始碼】使用MATLAB進行ECG模擬原始碼Matlab
- 模擬利用MV進行資料遷移
- 如何在Django ORM中進行not查詢?DjangoORM
- filter的pk進行多值查詢操作Filter
- ORDER對查詢結果進行排序排序
- oracle中對LONG列進行查詢Oracle
- 請問mysql裡面的text欄位怎麼進行模糊查詢MySql
- Java採用內部構造器Builder模式進行對類進行構建JavaUI模式
- Linq to Sql : 動態構造Expression進行動態查詢SQLExpress
- HBase之四--(1):Java操作Hbase進行建表、刪表以及對資料進行增刪改查,條件查詢...Java
- http模擬from表單提交,進行跨域請求和上傳資源HTTP跨域
- 模擬控制檔案丟失進行恢復。
- SOCKET模擬HTTP請求HTTP
- 使用Excel進行快速模糊查詢的方法Excel
- JPA使用Specification pattern 進行資料查詢
- 用於對執行慢的查詢進行優化優化
- 使用Socket進行HTTP請求與報文講解HTTP
- 使用 http-proxy 對網路請求進行代理HTTP
- 使用 gorilla/mux 進行 HTTP 請求路由和驗證GoUXHTTP路由
- 利用post請求傳送內容進行爬蟲爬蟲
- ruby進行http請求頭設定及獲取HTTP
- 使用jMeter構造大量併發HTTP請求進行微服務效能測試JMeterHTTP微服務