首页 / 浏览问题 / 云GIS / 问题详情
想获得服务的地图数据
12EXP 2017年07月21日
var response;
    var map, layer;
    //获取 XMLHttpRequest 对象
    var commit=getcommit();
    //HTTP 请求的方法类型,这里是 GET
    var method="GET";
    //请求的地址,即 maps 资源
    var uri=str+"/maps.rjson";
    //设置是否为异步通信
    var async=false;
    //用户名和密码,当服务器需要验证时指定
    
    //消息体(Entity Body)内容
    
    //建立 HTTP 连接
    commit.open(method,uri,async);
    //设置消息头(Message Headers)
    commit.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
    //发送 HTTP 请求
    
    commit.send(null);
    //commit.responseText 就是接收的服务器响应
    response = json_parse(commit.responseText, null);  
    //解析从服务器端返回的 json 字符串,解析为一个 JavaScript 对象。
    alert(response[0].name);

为什么得到了响应缺没法输出呢?

1个回答

建议在需要断点的地方写 debugger; 然后在浏览器开发者工具调试;或者在浏览器下断点(html里含js脚本的用火狐断点调试)、用 console.log(变量); 在开发者工具的控制台输出变量。

也可以直接在开发者工具的网络(或NetWork)查看http请求及响应,以确定是代码的问题还是服务端没有响应正确结果。

maps资源得到的只是该服务发布的地图列表的描述信息,而不是地图数据(点线面及属性、影像等),比如:
http://support.supermap.com.cn:8090/iserver/services/map-jingjin/rest/maps.rjson

毛瑞
1
1,780EXP 2017年07月21日

我这个应该算是响应了吧?

所以检查服务端响应及js代码,断点或输出响应对象.
主要是xmlhttp的send不能发出去  有一些可以请求出去,有一些请求不出去,这是为什么...

比如wms130/maps.rjson全部都能send出去

而 rest/maps.rjsona却不能.

这是为什么
建议掌握浏览器开发者工具的使用。
网络开发相关要熟悉开发者工具的网络工具,且了解http协议。

建议在开发者工具网络里检查http请求头、请求体及响应;同时对照js代码。

ps:浏览器地址栏访问一个url都是发送的http get请求,与你用ajax发送get请求并没有区别,所以get请求可以直接通过浏览器打开来验证服务是否返回了正确结果;其他计算机语言也很多支持发送http请求的。
<HTML>
 <HEAD>
  <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
  <TITLE>getMapsList</TITLE>
  <script  type="text/javascript" src="json_parse.js"></script>
  <script  type="text/javascript" src="toJSON.js"></script>
 </HEAD>

 <BODY>
    <input type="button" name="Submit" value="Test" onclick="getMapsList()" />
    <br><br>
    <div align=left id="container" style="left:50px;top:50px"></div>
 </BODY>
 <script  type="text/javascript">
 //示例代码添加的地方
//获取地图列表
function getMapsList()
{
	//获取XMLHttpRequest对象
	var commit=getcommit();
	//HTTP请求的方法类型,这里是GET
	var method="GET";
	//请求的地址
	var url="http://localhost:8090/iserver/services/map-china400/rest/maps.json";
	//设置是否为异步通信
	var async=false;
	//用户名和密码,当服务器需要验证时指定
	var user="";
	var password="";
	//消息体(Entity Body)内容
	var entry=null;

	//建立HTTP连接,对url进行编码以保证URI的正确性。
	commit.open(method,encodeURI(url),async,user,password);
	//设置消息头(Message Headers)
	commit.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
	//发送HTTP请求
	commit.send(entry);
	//commit.responseText就是接收的服务器响应
	//解析从服务器端返回的json字符串,解析为一个JavaScript对象。
	var response = json_parse(commit.responseText, null);		
	//获取用作显示的Div容器。
	var container = document.getElementById('container');
	//获取地图的个数
	var len=response.length;
	container.innerHTML="";
	for(var i=0;i<len;i++)
	{
		container.innerHTML += '<li>地图名:' + response[i].name + ',访问路径:' + response[i].path + '</li>';
	}		
}	
 </script>
</HTML>

这个是iserver的sample的样例,但是我仍然也不行...一直提示

Uncaught NetworkError: Failed to execute 'send' on 'XMLHttpRequest': Failed to load 'http://localhost:8090/iserver/services/map-china400/rest/maps.json'.

可以得到我要的信息
我已经解决了,又是跨域问题- -但是我已经在iserver的web.xml里面设置了允许CORS跨域的东西了,

然后我现在又加上了代理proxy.jsp才解决问题...
跨域不是这个报错,这个资源应该是允许跨域访问的,况且还是get请求,get请求一般默认允许跨域的,我试试先。
没问题,我直接以file:/// 打开该html,url改成
http://support.supermap.com.cn:8090/iserver/services/map-china400/rest/maps.json
能得到结果。

但是我真的是真的就加上了加上了两句话

声明代理的路径,

var proxyPath="http://localhost:8080/Java/proxy.jsp?";

然后 

$.ajax({ url:

proxyPath+"http://localhost:8090/iserver/services/map-china400/rest/maps.rjson",

就好了

如果不加上的话就会出现问题,我也奇怪为什么非要代理,我访问

http://localhost:8090/iserver/services.rjson也可以正常进行,就是地图列表的信息不能正常访问

根据地图服务,得到数据服务地址不就行了么,然后想获取啥都行
...