ArcGIS客户端开发学习笔记(五)——ArcGIS REST API基础

时间:2024-03-09 21:52:01

  REST:表述性状态转移(REpresentational State Transfer)的简称,它定义了应该如何正确地使用Web标准。

  目前我的水平还没到能够深入理解REST的地步,就连略懂皮毛都没达到。只是看过《深入浅出REST》,也谈不上看懂,下面把这文章里面总结的REST的五个关键原则列出来。

  1、为所有“事物”定义ID:使用URI标识所有值得标识的事物,特别是应用中提供的所有“高级”资源,无论这些资源代表单一数据项、数据项集合、虚拟亦或实际的对象还是计算结果等。

  2、将所有事物链接在一起:任何可能的情况下,使用链接指引可以被标识的事物(资源)。也正是超链接造就了现在的Web。

  3、使用标准方法:为使客户端程序能与你的资源相互协作,资源应该正确地实现默认的应用协议(HTTP),也就是使用标准的GET、PUT、POST和DELETE方法。

  4、资源多重表述:针对不同的需求提供资源多重表述。

  5、无状态通信。

  我自己的理解是:REST是一个Web架构。

 

一、ArcGIS REST API简介

  ArcGIS REST API提供了简单、开放的接口来访问和使用ArcGIS Server发布的服务。使用ArcGIS REST API通过URL,可以获取和操作每一个服务中的所有资源和操作。上面这句话很重要,指明了,使用REST API(就是ArcGIS REST API,下面都泛指ArcGIS REST API)其实就是通过URL来向GIS服务器获取资源的操作(这是我目前的理解,欢迎指出理解不当的地方)。比如,要通过REST API来访问一个GIS Server,可以使用下面格式的URL:

  1、java:

  http:<host>:8399/arcgis/rest

  2、.NET:

  http://<host>/arcgis/rest

  例如,要访问我自己的电脑:http://localhost/arcgis/rest/services。在浏览器地址栏输入这个地址后,可以看到下面这样的网页:

  上面那个地址,也叫做基本地址。通过地址,可以访问这个服务所提供的所有与之关联的资源和操作。

  Rest API是无状态的,这意味着Rest没有保存两个请求之间的信息,所以每个请求必须包含能进行成功处理的信息。

 

 

二、服务端点(Server End Point)

  每一个ArcGISServer都会提供一个Services Directory。ServicesDirectory是ArcGISServer Rest API的HTML格式的视图。通过这个视图可以浏览ArcGIS Server的内容和获取信息,比如服务的元数据和在开发应用程序时支持的操作。每个ArcGIS Server实例在它的初始化时就创建好了这个Services Directory。

整个ServiceDirectory是基于REST框架的。在使用ServicesDirectory时,你通过一系列的链接(一般就是URL)进行导向。每当点击或者使用一个链接时,你可以看到一个包含更多有关这个服务器上什么是可用的信息的新页面。这些信息就是使用URL通过REST框架得到的。

  使用REST API时,首先需要明确端点(Endpoint),这通常代表着服务器的目录。对于ArcGIS服务器,默认的端点是:

  http://<host>/<instance>/services/<folder>

  说明:

  • http://<host>是ArcGIS服务器的主机名。
  • /<instance>是实例名,也就是建立的ArcGIS服务器的实例名,默认为:“/arcgis/rest”。
  • /services这指出了这是REST服务终端。你在根目录下你可以看到这个ArcGIS服务器的所有服务。
  • /<folder>如果这个URL中包括folder,你可以看到在这个目录下的所有服务。

 

三、ArcGIS REST API框架

  ArcGIS REST是一个层次分明的框架体系。其中的一些资源是直接反应了服务本身的(Resources),比如目录、地图和图层等等;而另外一些则是一些操作的结果(Operations),比如从一个地图资源中导出一幅地图图片,或者得到一个图层的查询结果的集合。所以客户端从服务器端总是能得到一个资源的表现,在此一般分为两种类型的资源:

  • Resources(资源,直接反应了服务本身的信息)
  • Operations(操作,根据服务本身的资源进行某些处理后得到的结果)

  下面是整个ArcGISREST API的框架图

 

  可以看到,Catalog是整个REST APIURL分层等级的根。根下面就是这个Server所发布的服务,一共有8种类型的服务:Map Service、Geocode Service、GP Service、Geometry Service、Image Service、Network Service、GeoData Service和Globe Service。每一种Service下面都有不同的操作和资源,而执行这些操作和获取这些资源都是通过URL的。

 

 

四、ArcGIS REST API的使用

1、使用步骤

  从根本上说,RESTAPI就是由网址组成的。使用REST API的过程基本分为四个步骤:

  1)构建请求网址

  A、确定端点:每个GIS服务都有一个端点。例如,ArcGIS Server上Demographics文件夹下名为ESRI_Census_USA的一个地图服务sampleserver1.arcgisonline.com的端点为:http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ESRI_Census_USA/MapServer.

  B、确定操作:不同地理信息系统服务支持不同的操作。不同的操作会返回不同的结果。地图服务可以地图输出,点击查看,查找和生成KML。输出地图可以生成地图,同时可以点击产看是否给出地图服务图层的属性表。

  C、确定参数:不同的操作需要不同的参数。例如,如果请求地图图片,需要提供地图范围的四周角点坐标参数,也就是地图覆盖范围。

  D、确定输出格式:REST API支持很多输出格式,例如JSON,KMZ,图片和HTML。确定输出格式的重要参数是f。在URL请求的查询字符串后面加上”f=<你的格式>”来确定输出格式。例如:f=html返回的数据格式为html;f=json返回的数据格式为json;f=image返回的格式为image等等。

我们就以上面的4个步骤来构建自己需要的URL。一般来说,格式如下:

  http://{ArcGIS Server name}/ArcGIS/rest/services/{foldername}/{service name}/{service type}/{operation}?{{parameter1}={somevalues}&{parameter2}={some values}&…&{parameter}={some values}}

  可以看到,整个URL请求分为两个部分,第一部分是服务的端点和操作类型,也就是“?”前面的部分;第二部分是查询字符串,即请求参数,“?”后面的部分

  2)发送请求到ArcGIS Server

  提交URL请求到ArcGIS Server Sending,可以不通过编程发送URL请求。例如,只需在网页浏览器的地址栏输入网址,如IE或Firefox。每种编程语言都用不同的提出请求方式。

  3)接受服务器的响应

  接受ArcGISServer的响应,ArcGIS Server处理请求并返回响应到客户端。对于一个同步的工作,客户端一直等待收到服务器的响应。对于一部工作,服务器发送一份工作编号来定期跟踪客户端的工作状态。

  4)解析服务器响应

  ArcGIS Server REST Web服务的响应可以是多种格式,例如JSON,KML,图片和HTML。客户端可判断响应时成功还是失败。如果失败了,客户端可以判断错误信息。如果响应是成功的,客户端可以解析响应所需的信息,并恰当地利用这些信息。

 

2、使用方式

  1)不编程使用

  可以使用Web浏览器、ArcGISServer JavaSccript地图浏览器(f=jsapi)、ArcGIS Explorer(f=nmf)、ArcMap(f=lyr&v=9.3)、微软虚拟地球(f=ve)、谷歌地图(f=gmaps)、谷歌地球来使用ArcGIS REST API。

  用不同的工具使用RESTAPI的关键就是设置不同的f参数。下面是一个利用Web浏览器使用REST API的Demo。我是用的是我自己电脑上发布的世界地图服务World,在浏览器上输出我国范围的地图图片,需要指定下列参数:

  •   操作:输出图片f=image。
  •   地图边界框(取值格式:西、南、东、北):bbox=72,3,135.5,53,5。
  •   输出图像尺寸:size=600,400
  •   输出格式:f=image

  根据上述信息,构建的URL如下:

  http://localhost/ArcGIS/rest/services/World/MapServer/export?bbox=72,3,135.5,53,5&size=600,400&f=image

  在浏览器地址栏输出上面URL后得到的结果如下:

  2)编程使用

  这里我用客户端语言JavaScript借助Ajax技术使用REST API。通过REST API读取World服务的第一个图层的名字并显示在弹出对话框上。

代码
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
3  <html xmlns="http://www.w3.org/1999/xhtml">
4  <head>
5 <title>REST API DEMO</title>
6 <script type="text/javascript" language="javascript">
7 var request=null;
8 //根据不同浏览器创建请求对象
9   function createRequest()
10 {
11 try{
12 request=new XMLHttpRequest();
13 }
14 catch(trymicrosoft)
15 {
16 try{
17 request = new ActiveXObject("Msxm12.XMLHTTP");
18 }
19 catch(othermicrosoft)
20 {
21 try{
22 request = new ActiveXObject("Microsoft.XMLHTTP");
23 }
24 catch(faild)
25 {
26 request=null;
27 }
28 }
29 }
30 if(request==null)
31 alert("创建request对象失败");
32 }
33 function sendRESTrequest()
34 {
35 createRequest();
36 var restURL="http://localhost/ArcGIS/rest/services/World/MapServer/0?f=json";//构建的REST URL
37   request.open("GET",restURL,true);//请求对象初始化连接
38   request.onreadystatechange=processResponse;//设置服务器响应请求后的回调函数
39   request.send(null);//向服务器发送请求
40   }
41 function processResponse()
42 {
43 if(request.readyState==4)//就绪状态(ready state)有4个值“1:连接刚被初始化;
44   { //2:正在处理请求;3:服务器快要完成请求;4:请求完成,浏览器得到响应”
45   var response=eval(\'(\'+request.responseText+\')\');//返回的是一个文本,需要用eval函数转成json对象
46   alert("图层ID:"+response.id+"\n"+
47 "图层名:"+response.name+"\n"+
48 "图层的显示字段:"+response.displayField);
49 }
50 }
51 </script>
52 </head>
53 <body onload="sendRESTrequest()">
54
55 </body>
56 </html>
57

  上面就是利用Ajax技术使用ArcGIS RESTAPI。关键就是url的构建。这里需要注意的是,这样的请求一般是跨域请求,随着安全性的增加,这样的请求将慢慢被禁止,所以在实际使用时最好使用本地代理程序进行请求。

 

总结

  REST是一个Web应用程序框架。ArcGIS REST API简单易懂且高效。使用ArcGIS REST API的关键两点:熟悉它的框架构建正确的符合自己需要的URL请求

 

参考资料:

《ArcGIS Server REST API Help》

《ArcGISServer 9.3 REST基础教程》

《深入浅出REST》:www.infoq.com/cn/articles/rest-introduction

《深入浅出Javascript API 第一讲浅析 AGS REST API》:http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=31969