自己构建Ajax请求进行模拟QueryTask进行查询

来源:互联网 发布:java开源网站有哪些 编辑:程序博客网 时间:2024/06/05 11:13

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,这样在ArcGS的Server端才会正确调用客户端的回调函数。以上就是用原生的dojo模拟ArcGIS JS API中QueryTask的功能。

原创粉丝点击