`
louis_cuti
  • 浏览: 12992 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

利用HttpClient使得Openlayers3能够访问跨域访问arcgis for server

    博客分类:
  • java
 
阅读更多

最近做一个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解决跨域问题

    我使用的是httpClient 进行内部转发 我们在A的服务器上,将前台的文件流,通过httpClient传输到B的服务器上(B的服务器通过控制层接受A传输的文件流,让后保存在B的服务器上。返回一个json结果)

    arcgis server9.3案例(jsf)1

    3. **REST API交互**:ArcGIS Server 9.3支持RESTful接口,开发者可以利用JSF的HTTP客户端库(如Apache HttpClient或Java内置的HttpURLConnection)发送HTTP请求,获取地图服务数据或执行空间分析任务。 4. **数据...

    使用httpclient访问servlet

    总之,使用HttpClient访问Servlet能够简化Java应用之间的通信,特别是在分布式系统中。正确理解和应用HttpClient的各种特性和配置,能够帮助我们构建高效、可靠的网络通信方案。在实际开发中,还需要根据具体项目...

    实现http协议两端httpserver和httpclient

    在这个项目中,文件"HTTPClient"和"HttpServer"可能是分别实现了客户端和服务器端的源代码文件。通过阅读和理解这些代码,你可以深入学习到如何在VC++中实现HTTP通信,以及如何处理网络数据的发送和接收。 总之,...

    利用HttpClient发送HTTP请求

    利用HttpClient发送HTTP请求 利用HttpClient发送HTTP请求

    httpclient来进行https访问

    通过`httpclient`,开发者能够轻松地发送各种类型的HTTP请求(如GET、POST等),同时还能处理响应数据。 #### 2. HTTPS访问的重要性 HTTPS协议(超文本传输安全协议)是一种安全的HTTP通道,在计算机网络上实现一...

    轻量级C++实现的httpserver和httpclient

    本项目聚焦于轻量级的C++实现的HTTP服务器(httpserver)和HTTP客户端(httpclient),利用mongoose库作为基础,为开发者提供了一种简单且高效的方法来添加HTTP功能,而无需依赖如libcurl这样的大型库。 HTTP(超...

    httpclient 跨域请求

    3. 添加请求头:对于跨域请求,可能需要添加`Origin`头表示请求来源。 ```java httpGet.setHeader("Origin", "http://yourdomain.com"); httpPost.setHeader("Origin", "http://yourdomain.com"); ``` 4. 发送请求并...

    HttpClient代理访问网络

    HttpClient代理访问网络

    JAVA利用HttpClient进行HTTPS接口调用

    3. 使用HttpClientUtil创建的HttpClient实例执行请求,如`CloseableHttpResponse response = httpClient.execute(request);` 4. 检查响应状态码,例如,200表示成功,其他代码可能表示错误。 5. 读取响应内容,如果...

    HttpServer.zip_http servlet server_httpclient_http服务器_java https

    1. HttpClient使用:创建HttpClient实例,配置请求参数,然后通过execute方法发送请求,获取响应。它可以方便地处理各种复杂的HTTP请求场景。 2. 请求与响应处理:HttpClient允许开发者精细控制请求头、请求体、...

    c++mongoose 实现httpserver,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

    c++ http通讯 基于mongoose 的httpserver和httpclient。Mongoose是一个轻量化的web服务器,通过提供一个web接口给它,它可以嵌入到现有的工程当中。Mongoose的整个代码只有一个c文件和一个h文件,使用起来非常方便。...

    HttpClient 3.x to HttpComponents HttpClient 4.x

    随着技术的发展,从早期的HttpClient 3.x版本迁移到更新的HttpComponents HttpClient 4.x版本是一个常见的需求。这不仅仅是一个简单的升级过程,而是涉及到对API的变化、编程模型的更新以及对网络编程的更深层次理解...

    ETL KETTLE 中利用Httpclient 调用webservice接口获取XML数据,并解析XML 数据

    ETL KETTLE 中利用Httpclient 调用webservice接口获取XML数据,并解析XML 数据。 完整的KTR实例

    使用httpClient访问https+443端口号。

    HttpClient支持多种认证机制、重定向策略、连接管理和时间控制等,使得开发者能够灵活地构建复杂的HTTP交互逻辑。 描述中提到的链接指向了一个ITEYE博客文章,虽然内容没有给出,但通常这类文章会包含如何配置和...

    HttpClient问题:The server failed to respond with a valid HTTP resp

    检查网络连接,确保能够访问其他Web服务,如果网络没有问题,那么问题可能在于服务器或HttpClient的配置。 2. **服务器配置**:服务器可能存在配置错误,例如服务器端口没有打开,服务器应用程序崩溃,或者服务器不...

    c#调用arcgis地图rest服务示例详解(arcgis地图输出)

    通过这种方式,C#开发者能够利用ArcGIS REST API与ArcGIS Server进行交互,实现地图服务的定制化功能,如添加、修改、删除地图要素,获取地图图片,进行空间分析等。在实际开发中,还需考虑错误处理、权限控制、性能...

    HttpClient for android 4 3 5 jar

    这个"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文件,它包含了...

    简单的httpClient访问

    在IT行业中,HttpClient是一个广泛使用的Java库,它允许开发者通过HTTP协议进行网络通信。这篇名为“简单的httpClient访问”的博文...通过学习和实践这些知识,开发者可以有效地利用HttpClient实现各种网络通信任务。

Global site tag (gtag.js) - Google Analytics