REST API 简介
SuperMap iServer 提供了基于 REST 的应用编程接口——SuperMap iServer REST API,这些接口封装了大部分的 GIS 功能,包括基本的地图功能,数据编辑功能,分析功能等。SuperMap iServer 将这些 GIS 功能通过 SuperMap iServer REST API 提供给客户端,客户端使用这些 API,能够获取到相应的 GIS 能力。
SuperMap iServer REST API 包括以下特点:
- 所有 GIS 能力被封装为不同的资源,并且每一个资源通过唯一的 URI 进行标识。
- SuperMap iServer REST API 使用 HTTP 协议标准的方法实现对资源的操作,即对 GIS 功能的操作。包括:GET(获取资源)、POST(创建资源)、PUT(创建、修改资源)、DELETE (删除资源)方法等。
- SuperMap iServer 对资源的描述以及 GIS 计算结果通过资源表述的方式表达,且支持多种格式的资源表述,包括 HTML、XML、JSON、BMP 等。
使用 REST API 的基本流程
REST 服务越来越受到开发者的欢迎其中一个原因就是使用 REST 服务比较简单,因为获取 REST 服务基本上就是通过对资源的 URI 的操作实现的。使用 SuperMap iServer REST API 大致要分为以下几个步骤:
- 浏览 REST 服务目录,确定资源 URI、需要的参数结构、支持的表述格式等。
您可以通过 SuperMap iServer 的帮助文档查阅 REST API 的接口信息。(如果比较了解资源,此步骤可以省略。)
- 构建 HTTP 请求,包括资源的 URI 、所需传递的参数、对资源执行的 HTTP 方法。
- 构建 URI:SuperMap iServer 的 REST 资源采用层次结构组织,每一类 REST 服务都有一个根资源,如地图 REST 服务的根资源为 maps,maps 的子资源为 map,layers 资源为 map 资源的子资源,以此类推。根据这一的规则,用户可以构建资源的 URI。如 layers 资源的 URI 为:
http://192.168.1.1:8090/iserver/services/map-world/rest/maps/World Map/layers
其中,192.168.1.1:8090 是 SuperMap iServer 服务器地址和端口, iserver/services/map-world/rest 是 REST 服务的根目录,即 root 目录名称。 maps/World Map 是 layers 的父资源。
- 整理待传递的参数:REST 资源不同,执行的 HTTP 方法不同所需要传递的参数可能不同,因此用户需要针对具体的资源和请求的方法,确定传递的参数内容。
在 SuperMap iServer 中规定,发送 GET 请求时,参数信息有两种传递方式,一是参数包含在 URI 中,二是参数放在请求体中(当参数信息很大的时候)。发送 POST,PUT 请求时,参数信息放在请求体中,且请求体中的参数信息以 JSON(默认方式) 或者 XML 方式组织。请求体中的参数组织格式的选择通过设置请求头中的 X-RequestEntity-ContentType 信息来决定。 X-RequestEntity-ContentType 为 application/json 时,标识请求体中的参数为 JSON 格式,为 application/xml 时,标识请求体中的参数为 XML 格式。服务器通过解析请求头,就能知道该按照 JSON 还是 XML 的格式来解析参数。
例如:参数包含在 URI 中:
http://192.168.1.1:8090/iserver/services/map-world/rest/maps/World Map/image.bmp?center={"x":103,"y":34}&scale=0.001
参数包含在请求体中:
对地图 World Map(map 资源)进行地图状态修改,使其默认中心点改为(142,44),可以对 URI:http://192.168.1.1:8090/iserver/services/map-world/rest/maps/World Map.json 构建 PUT 请求,参数放在 PUT 请求的请求体里,JSON 组织形式如下:
{"name":"World", "center":{"x":142, "y":44}}
说明:目前 SuperMap iServer 仅支持 JSON 和 XML 两种参数组织格式,如果需要使用其他格式组织参数,需要在 REST 服务端扩展参数解析器,使参数解析器能够解读该格式的参数。
- 确定对资源执行的 HTTP 方法:不同的 HTTP 方法可以对资源执行不同能力的操作,如 POST 方法表示创建一个资源,DELETE 方法表示删除一个资源。客户端需要确定对资源做何种操作。
- 设置资源表述格式:向资源发送请求,资源会将结果以资源表述的方式返回给客户端,SuperMap iServer 支持多种表述格式,因此客户端在提交请求的时候需要指定服务端返回哪种格式的表述。设置表述的格式只需要在 URI 后面加上.<format>即可,如 http://192.168.1.1:8090/iserver/services/map-world/rest/maps.json。
- 向 REST 服务器发送 HTTP 请求。
对于 GET 方法提交请求可以直接在浏览器的地址栏中输入 URI 即可。其他方法(POST、PUT、DELETE、HEAD)提交请求需要通过编程实现,不同的开发语言实现的方法不同。
- 接收 REST 返回的资源表述。
SuperMap iServer 的 REST 资源有几种类型,其中包括同步资源(除异步资源外所有资源均为同步传输机制的资源)和异步资源,即对资源的表述以同步或者异步的方式返回客户端。因此客户端在向 REST 服务器发送 HTTP 请求时,需要根据访问的资源的类型发送同步/异步请求。同理,客户端在接收 REST 返回的资源表述时,也需要根据资源的类型(同步资源或者异步资源)以正确的方式获取资源表述。如,客户端应该向 area 资源(同步资源)发送同步传输请求,并以同步传输方式获取 area 资源表述。目前 SuperMap iServer 大部分都是同步资源。
- 参照资源的响应结构,解析资源表述,提取所需的信息。
REST 服务器会返回 HTTP 状态代码以响应客户端请求,通过响应码,客户端可以得知请求的处理情况。例如:是否成功、出错的原因,等等。如果返回成功的响应码,客户端可以进一步解析返回的资源表述,REST 服务器响应的资源表述结果支持多种格式,如 XML,HTML,JSON,PNG 等,主要取决于客户端发送请求时对返回的资源表述的格式的选择。如果返回操作失败的响应码,客户端可以获取出错原因。
直接通过网址获取 REST 服务
在 HTTP 的方法中仅有 GET 方法是浏览器默认支持的 HTTP 方法,通过 GET 方法客户端可以获取资源的信息描述,因此,如果希望了解 REST 服务中提供的各种资源目录,各种资源的能力等,可以直接在浏览器的地址栏中输入资源 URI。如果希望返回的响应结果以某种固定的格式显示,可以给 URI 加上后缀,形如.[format]。例如在地址栏输入:
http://192.168.1.1:8090/iserver/services/components-rest/rest.html
可以看到以 HTML 格式描述的 REST 服务目录。
http://192.168.1.1:8090/iserver/services/components-rest/rest/maps/World Map/image.png
表明向 world Map 地图的 image 资源执行 GET 方法,获取 world Map 地图图片。
通过 iClient for JavaScript 获取 REST 服务
通常 JavaScript 通过 XMLHTTPRequest 建立和发送请求,并响应服务器。经常用到的方法如下:
- open():建立到服务器的新请求。
- send():向服务器发送请求。
- abort():退出当前请求。
- readyState:提供当前 HTML 的就绪状态。
- responseText:服务器返回的请求响应文本。
根据前面介绍的开发步骤,依次构建 URI,发送请求,接收和解析结果。下面的例子是修改地图-World Map 的中心点。
资源 URI: http://192.168.1.1:8090/iserver/services/map-world/rest/maps/世界地图
返回的资源表述格式:JSON
使用的 HTTP 方法:GET 和 PUT。先使用 GET 方法获取 World 的基本地图信息。再通过 PUT 方法,修改 GET 方法获取的基本地图信息中的中心点的值。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>REST</TITLE>
</HEAD>
<script type="text/javascript" src="json_parse.js"></script>
<script type="text/javascript" src="toJSON.js"></script>
<script type="text/javascript">
function GetMapInfo() {
request = new ActiveXObject("Msxml2.XMLHTTP");
var uri="http://localhost:8090/iserver/services/maps/rest/maps/World Map.json";
request.open("GET",encodeURI(uri),false,"","");
request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
request.send(null);
if(request.status==200){
//解析从服务器端返回的 json 字符串,解析为一个 JavaScript 对象。json_parse()为 json_parse.js 文件中的一个解析 json 的函数。
var response = json_parse(request.responseText, null);
//获取用作显示的 Div 容器。
var container = document.getElementById('container');
//输出结果
container.innerHTML="";
container.innerHTML += '<p>地图名:' + response.name +'</p>';
container.innerHTML += '<p>地图显示区域:<li>leftBottom:' + toJSON(response.bounds.leftBottom) +'</li>'+'<li>rightTop:'+toJSON(response.bounds.rightTop)+'</p>';
container.innerHTML += '<p>用户视窗范围:<li>leftTop:' + toJSON(response.viewer.leftTop) +'</li>'+'<li>rightBottom:'+toJSON(response.viewer.rightBottom)+'</p>';
container.innerHTML += '<p>地图比例尺:1:' + Math.round(1/response.scale) +'</p>';
}else{
alert("操作失败!");
}
}
</script>
<BODY>
<input type="button" value="GetMapInfo" onclick="GetMapInfo()" /></input>
<br><br>
<div align=left id="container" style="left:50px;top:50px">
</BODY>
</HTML>
注意:通过这种方式获取 REST 服务时,需要从安装目录下,samples/code/HelloREST 目录中复制 json_parse.js 和 toJSON.js 文件到 HelloREST.html 的同级目录。json_parse.js 中包含了 json_parse 方法,用于解析 JSON 字符串为 javascript 中的 Object 对象,toJSON.js 中包含了 toJSON 方法,用于将 Object 对象转化为 JSON 字符串。