最近做一个WebGIS的项目,使用的是Openlayers3 v3.17.1的版本,需要用到ajax调用ArcGIS for Server 10.2发布的WMS服务,业务应用于GIS服务不在一个域内,需要解决跨域的问题。
1、(不是最终解决方案,可略过)网上有一篇关于跨域的解决办法,讲的比较明白:http://www.cnblogs.com/dojo-lzz/p/4265637.html
几种解决办法,基本都要更改GIS服务器端的内容,暂时决定采用JSONP的方式来解决该问题,这时需要解决的另外一个问题出现了,那就是修改WMS的查询结果的格式。
2、(不是最终解决方案,可略过)查询ArcGIS for Server的帮助文档,看到其可以自定义 WMS GetFeatureInfo 响应,以为发现了神器,结果不知道是参数传递的问题,还是其他原因,不成功。
有一段话,特别重要。
使用 xslt_template 参数时,XSLT 模板不必遵循与默认模板相同的命名约定,但它需要经由 URL 提供。指定本地路径或 UNC 路径会导致请求失败。
从ArcGIS for Server的安装目录ArcGIS\Server\Styles\WMS中拷贝一个XSLT的模板出来,发布出来,保证可以正常访问。
将我的WMS的GetFeatureInfo的请求地址放到这里,还请大家能够看看有没有问题,将无论version是1.1.1和1.3.0都不行,
http://192.168.1.125:6080/arcgis/services/ymfb/ymfb/MapServer/WMSServer?service=WMS&version=1.3.0&request=GetFeatureInfo&layers=10&query_layers=10&INFO_FORMAT=text/plain&I=21&J=59&WIDTH=256&HEIGHT=256&SRS=EPSG:4326&CRS=EPSG:4326&STYLES=&BBOX=33.75,109.6875,36.5625,112.5&xsl_template=http://localhost:8081/ymgis/data/featureinfo_application_geojson.xsl
3、(终极解决方案)这时候,突然想起来以前用过httpclient,能不能用这个来实现呢?
httpclient的项目的地址:http://hc.apache.org/
使用异步请求插件HttpAsyncClient 4.1.2,官方包里有简单的应用例子,可以参照下。
需要强调的是,httpclient的ajax请求,只能是get,不能用post,这主要是由于ArcGIS for Server决定的,和httpclient本身无关。通过这种方式,最终拿到了wms的返回结果。
4、部分代码,自定义的中转跨域请求的代码,proxyData变量作为返回到前台的变量,本项目用的Struts2,应用原理都是一样的。
4.1用来中转请求的Action代码
public static String Inputstr2Str_Reader(InputStream in, String encode) { String str = ""; try { if (encode == null || encode.equals("")) { // 默认以utf-8形式 encode = "utf-8"; } BufferedReader reader = new BufferedReader(new InputStreamReader(in, encode)); StringBuffer sb = new StringBuffer(); while ((str = reader.readLine()) != null) { sb.append(str).append("\n"); } return sb.toString(); } catch (UnsupportedEncodingException e1) { e1.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return str; } public String proxyAjax() throws ExecutionException, IOException, InterruptedException { HttpServletRequest request = ServletActionContext.getRequest(); String url = request.getParameter("url"); CloseableHttpAsyncClient httpClient = HttpAsyncClients.createDefault(); try { // Start the client httpClient.start(); // One most likely would want to use a callback for operation result final CountDownLatch latch1 = new CountDownLatch(1);//线程辅助类,官方例子 final HttpGet request2 = new HttpGet(url);//wms服务, arcgis只能用get调用 httpClient.execute(request2, new FutureCallback<HttpResponse>() { @Override public void completed(final HttpResponse response2) { latch1.countDown(); InputStream inputStream; try { inputStream = response2.getEntity().getContent(); proxyData=Inputstr2Str_Reader(inputStream, "UTF-8"); } catch (UnsupportedOperationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public void failed(final Exception ex) { latch1.countDown(); System.out.println(request2.getRequestLine() + "->" + ex); } @Override public void cancelled() { latch1.countDown(); System.out.println(request2.getRequestLine() + " cancelled"); } }); latch1.await(); } finally { httpClient.close(); } // this.proxyData = url; return ActionSupport.SUCCESS; }
4.2前台JS代码
function(e) { var viewResolution = map.getView().getResolution(); var url = wmsSource.getGetFeatureInfoUrl(e.coordinate,iewResolution,"EPSG:4326",{ INFO_FORMAT : "text/plain" }); var ajaxUrl="http://localhost:8081/ymgis/proxyAjax.action?url="+encodeURIComponent(url); $.ajax({url:ajaxUrl,success:function(data){ alert(data); }}); }
相关推荐
我使用的是httpClient 进行内部转发 我们在A的服务器上,将前台的文件流,通过httpClient传输到B的服务器上(B的服务器通过控制层接受A传输的文件流,让后保存在B的服务器上。返回一个json结果)
3. **REST API交互**:ArcGIS Server 9.3支持RESTful接口,开发者可以利用JSF的HTTP客户端库(如Apache HttpClient或Java内置的HttpURLConnection)发送HTTP请求,获取地图服务数据或执行空间分析任务。 4. **数据...
总之,使用HttpClient访问Servlet能够简化Java应用之间的通信,特别是在分布式系统中。正确理解和应用HttpClient的各种特性和配置,能够帮助我们构建高效、可靠的网络通信方案。在实际开发中,还需要根据具体项目...
在这个项目中,文件"HTTPClient"和"HttpServer"可能是分别实现了客户端和服务器端的源代码文件。通过阅读和理解这些代码,你可以深入学习到如何在VC++中实现HTTP通信,以及如何处理网络数据的发送和接收。 总之,...
利用HttpClient发送HTTP请求 利用HttpClient发送HTTP请求
通过`httpclient`,开发者能够轻松地发送各种类型的HTTP请求(如GET、POST等),同时还能处理响应数据。 #### 2. HTTPS访问的重要性 HTTPS协议(超文本传输安全协议)是一种安全的HTTP通道,在计算机网络上实现一...
本项目聚焦于轻量级的C++实现的HTTP服务器(httpserver)和HTTP客户端(httpclient),利用mongoose库作为基础,为开发者提供了一种简单且高效的方法来添加HTTP功能,而无需依赖如libcurl这样的大型库。 HTTP(超...
3. 添加请求头:对于跨域请求,可能需要添加`Origin`头表示请求来源。 ```java httpGet.setHeader("Origin", "http://yourdomain.com"); httpPost.setHeader("Origin", "http://yourdomain.com"); ``` 4. 发送请求并...
HttpClient代理访问网络
3. 使用HttpClientUtil创建的HttpClient实例执行请求,如`CloseableHttpResponse response = httpClient.execute(request);` 4. 检查响应状态码,例如,200表示成功,其他代码可能表示错误。 5. 读取响应内容,如果...
1. HttpClient使用:创建HttpClient实例,配置请求参数,然后通过execute方法发送请求,获取响应。它可以方便地处理各种复杂的HTTP请求场景。 2. 请求与响应处理:HttpClient允许开发者精细控制请求头、请求体、...
struct mg_server *server = mg_create_server(NULL, cb); mg_set_option(server, "listening_port", "8080"); mg_start_server(&server, NULL); // 等待服务器运行 mg_stop_server(&server); return 0; } ```...
c++ http通讯 基于mongoose 的httpserver和httpclient。Mongoose是一个轻量化的web服务器,通过提供一个web接口给它,它可以嵌入到现有的工程当中。Mongoose的整个代码只有一个c文件和一个h文件,使用起来非常方便。...
随着技术的发展,从早期的HttpClient 3.x版本迁移到更新的HttpComponents HttpClient 4.x版本是一个常见的需求。这不仅仅是一个简单的升级过程,而是涉及到对API的变化、编程模型的更新以及对网络编程的更深层次理解...
ETL KETTLE 中利用Httpclient 调用webservice接口获取XML数据,并解析XML 数据。 完整的KTR实例
HttpClient支持多种认证机制、重定向策略、连接管理和时间控制等,使得开发者能够灵活地构建复杂的HTTP交互逻辑。 描述中提到的链接指向了一个ITEYE博客文章,虽然内容没有给出,但通常这类文章会包含如何配置和...
检查网络连接,确保能够访问其他Web服务,如果网络没有问题,那么问题可能在于服务器或HttpClient的配置。 2. **服务器配置**:服务器可能存在配置错误,例如服务器端口没有打开,服务器应用程序崩溃,或者服务器不...
通过这种方式,C#开发者能够利用ArcGIS REST API与ArcGIS Server进行交互,实现地图服务的定制化功能,如添加、修改、删除地图要素,获取地图图片,进行空间分析等。在实际开发中,还需考虑错误处理、权限控制、性能...
这个"HttpClient for android 4.3.5 jar"包含了两个文件:`httpclient-android-4.3.5-sources.jar`和`httpclient-android-4.3.5.jar`。 `httpclient-android-4.3.5-sources.jar`是源码版本的jar文件,它包含了...
在IT行业中,HttpClient是一个广泛使用的Java库,它允许开发者通过HTTP协议进行网络通信。这篇名为“简单的httpClient访问”的博文...通过学习和实践这些知识,开发者可以有效地利用HttpClient实现各种网络通信任务。