ArcGIS 服务对象扩展(SOE)新手自学笔记(4):Schema、Resource、Operation

 前面几节我们介绍了SOE基本概念、REST SOE模板以及如何处理输入输出数据。今天详细介绍一下SOE中三个重要概念:Schema、Resource、Operation。

1.Schema

  SOE中的Resource和Operation所组成的结构就是Schema,也可以说Shcema确定了SOE中Resource和Operation的层次结构。通常由IRESTRequestHandler接口的GetSchema()方法来返回该SOE的Schema,作为一个JSON格式的字符串被返回。在REST API中可以通过讲一个http请求的参数设置为“f=schema”来获取Schema。

  下面我们来看几个Schema的例子

    Schema1 只有一个Operation

{
  "operations" : [ "buffer", "near" ]
}
  在该例子中,SOE之暴露了一个Operation,从REST API角度来讲,这个SOE之暴露了两个URL。SOE跟资源和Buffer Operation:

http://<service-url>/exts/<extensionName> //root SOE resource
http://<service-url>/exts/<extensionName>/buffer //buffer operation

    Schema2 有多个Operation

{
  "operations" : [ "buffer", "near" ]
}

  在该Schema中Operation是一个数组,所以可以指定多个操作。从REST API角度来讲,这个SOE暴露了三个URL、SOE跟资源、Buffer和near操做:

http://<service-url>/exts/<extensionName> //root SOE resource
http://<service-url>/exts/<extensionName>/buffer //buffer operation
http://<service-url>/exts/<extensionName>/near //near operation

  Schema3 具有参数的Operation和它指定的参数以及输出格式

{
  "operations" : [
    {
      "name" : "buffer",
      "parameters" : ["location", "distance"],
      "supportedOutputFormats" : ["json", "amf"]
    },
    {
      "name" : "near",
      "parameters" : ["location", "distance", "lookingFor"],
      "supportedOutputFormats" : ["json"]
    }
  ]
}
它同Schema2暴露的URL是一样的,区别在于它不仅制定了Operation的名称,还有一些Operation的附属信息,稍后我们会继续讨论这种Schema。

  Schema 4  子Resource
{
  "name" : "MyMapServiceExtension",
  "operations" : ["export", "identify"],
  "resources" : [
    {
      "name" : "metadata"
    },
    {
      "name" : "layers",
      "isCollection" : true,
      "operations" : ["query"],
      "resources" : [
        {
          "name" : "features",
          "isCollection" : true
        }
      ]
    }
  ]
}

该Schema中除了Operation外,还指定了它的子Resource。该SOE包含两个根级Operation:export和identify,同时也包含了两个子资源: metadata和layers。
metadata资源可以通过以下URL获得:
http://<service-url>/exts/<extensionName>/metadata

注意到layers是一个Collection Resource(集合资源,因为其isCollection属性为true),可以通过以下URL访问它的子图层资源:

http://<service-url>/exts/<extensionName>/layers/<layerId>

同时,每一个图层都支持query操作,如下URL:

http://<service-url>/exts/<extensionName>/layers/<layerId>/query

每一个图层中又包含了features子资源。features也是一个集合资源,每个特定的feature可以通过以下URL访问:

http://<service-url>/exts/<extensionName>/layers/<layerId>/features/<featureId>

2.Resource

  所有的SOE服务最少支持一个根级的Resource和Operation,如果Schema指定的话也可以包含子资源。

  REST handler经常会从SOE中获取一个resource的json表达。如果客户端使用“f=json”开请求一个resource,SOE将会以json格式发送到客户端。另一方面,如果使用Services Directory显示的话,通常会将json转换为html形式显示在网页上。

  现在假定通过SOE返回的json格式的根资源如下:

{
  "description: "Contitental US",
  "extent" : { "xmin" : ..., "ymin" : ..., ...},
  "spatialReference" : {...},
  ...

  "layers" : [
    { "id" : 0, "name" : "Cities", ... },
    { "id" : 1, "name" : "Counties", ... },
    { "id" : 2, "name" : "States", ... }
  ]

  ...
}

当其在Services Directory中显示时,Rest handler会发现一个“layers”属性,由于他在Schema中被指定作为Collection Resource,将会首先检查这个属性(layers)的值是否是一个json数组,进一步检查每个元素是否是一个具有id和name属性的json对象。这样将会用他的name作为显示而将id放在放在URL连接中。点击Cities时会获得如下URL:

http://<service-url>/exts/<extensionName>/layers/0 //the Cities layer

在Services Directory中如下显示:

  使用REST API获取一个SOE的resource,实际上是触发了SOE中的handleRESTRequest方法。对于resource请求,该方法的OpeartionName参数将是一个空字符串,而resourceName参数是一个跟SOE的resource相关的字符串。下图展示了在Schema4中对于不同的resource的REST请求,将被转换成handleRequest触发时的resourceName参数:

3.Operation

  如果SOE的Schema中指定了某些resource支持Operation,该resource的Services Directory页面将会显示出Operation的链接。如:

 

  在Schema2中之定义了一个Operation的名字,并没有参数和返回格式信息,这时Services Directory通常会显示一个form,用户需要在此提供参数信息和值,在Schema中的buffer Operation将会如下显示:

  类似resource,用REST API发送Operation请求时也触发了HandleRESTRequest方法。这时候operationName将是一个非空字符串,resourceName将是一个与SOE的resource有关联的字符串。在Schema4中,发送不同的Operation请求,将被转换成handleRESTRequest触发时的resourceName和operationName:

  REST客户端会把operation参数作为query parameter放在URL中。在handleRESTRequest出发之前,REST handle将输入参数强制转换成json对象,参数名作为json对象的属性名,参数值作为有意义的json对象值,如数字、bool、json对象、json数组,如果不能转换成上述类型则转换为字符串。handleRESTRequest中的outformat参数设置为“f”指定的类型。

http://<service-url>/exts/<extensionName>/near?
location={x: -117.05, y: 34.11}&distance=2.5&&lookingFor=ATM&f=json

上述请求中,location参数将会被转换成json对象,distance被转换成数字,lookingFor将被转换成string。在触发handleRESTRequest方法之前,operationInput参数将被转换成如下json对象:

{
  "location" : {x: -117.05, y: 34.11}, //JSON object
  "distance" : 2.5, //number
  "lookingFor" : "ATM" //string
}

以上就是这节要说的内容,特别声明一下,本篇内容并非原创,大部分内容参考了这篇文章:

http://atlas.resources.ca.gov/arcgis/SDK/REST/extension.html

时间: 2025-01-20 08:55:44

ArcGIS 服务对象扩展(SOE)新手自学笔记(4):Schema、Resource、Operation的相关文章

ArcGIS 服务对象扩展(SOE)新手自学笔记(1):初识SOE

1.SOE介绍 在ArcGIS 10.1中ArcGIS Server不在支持DCOM方式的连接,这也就意味着我们不能通过本地方式的连接使用ArcObjects提供的更多功能,所以我们推荐一种新的方式来实现这些功能,这种方式就是SOE服务器对象扩展.SOE存在于整个服务对象的生存期内,可以利用服务对象的资源并对其进行扩展.一个SOE通常在服务对象创建是初始化,并且在整个服务对象的生存期内只会被创建一次.SOE支持SOAP和REST两种访问方式,其通过强大的AO来扩展服务对象,并可以运行在一个没有A

ArcGIS 服务对象扩展(SOE)新手自学笔记(5):注册与调试

上一篇到现在过去好几天了,本来打算用ESRI官方自带的例子呢,后来觉得还是应该实践一下.这几天都在忙着写这个例子,其中也出现了好多问题,从一开始思考解决问题的方法,到找代码,再调试成功,费了不少事,好在问题都已经解决了.不喜欢说废话,还是忍不住说了这么多,下面正式进入主题. 首先说说我们要解决的问题.gp服务广泛使用的一个原因是他可以做栅格数据的分析,那好我们就用SOE来解决一个插值问题.在gp服务中,我们可以通过设置输入输出类型来保客户端成功加载分析结果,大部分分析结果是以图片形式传到客户端.

ArcGIS 服务对象扩展(SOE)新手自学笔记(2):REST SOE模板上

1.REST SOE 当客户端使用REST方式发送SOE请求时,实际上是利用HTTP协议发送了一个请求字符串,ArcServer获得该字符串后会将其解析成一系列命令执行,并返回JSON数据. 返回的JSON格式数据如下:   2.创建REST SOE (1)提醒 为了确保你创建的REST SOE能够成功执行,你需要仔细考虑一下向服务器端发送请求的数据类型和你希望返回的数据. 一个REST SOE通常包含资源和操作两部分(Resource和Operation): Resource---可以从服务器

ArcGIS 服务对象扩展(SOE)新手自学笔记(3):REST SOE模板下

1.CreateRESTSchema()和Handle function CreateRESTSchema函数中定义了在你的SOE中可以获取的Resource和Operation,每一个Resource和Operation都与一个处理函数(handle function)相关联.该处理函数用来在Resource或Operation被触发时,描述所要进行的处理操作.这里面就是你需要编写大量AO代码的地方. 在REST SOE模板中,有一个处理resource逻辑的RootRESTHandler函数

运行Node.js的IIS扩展iisnode安装配置笔记

 这篇文章主要介绍了运行Node.js的IIS扩展iisnode安装配置笔记,iisnode的扩展可以把Node.js程序托管到IIS,托管之后也意味着可以使用IIS里面的各种功能,需要的朋友可以参考下     今年年初打算用Node.js基于Express框架重写博客程序,从此告别ASP.NET.然而,我目前用的VPS是Windows Server系统.IIS服务器,如果让Express和IIS都监听80端口,明显会产生冲突.幸好,有一个叫做iisnode的扩展可以把Node.js程序托管到I

新手自学才c++,请教前辈个问题

问题描述 新手自学才c++,请教前辈个问题 一个类的成员函数 string toString() const 这个const在这里是做什么用的呢,小弟不太理解 解决方案 把成员函数标记为const ,意思就是将此成员函数内部用到的数据成员都标记为const 引用,就是不能够在此函数内部修改对象的数据成员. 非const 对象可以调用const成员函数和非const 成员函数,const对象只能调用const 成员函数 解决方案二: 说明这个函数里不能更改数据成员,也不能调用非const函数.一般

新手自学unity3d遇到了一些问题

问题描述 新手自学unity3d遇到了一些问题 我在"我要自学网"按照caoyutan老师那个射弹游戏案例自己做了一下,卡在了那个让消灭数自加的脚本代码中,代码如下: #pragma strict function Start () { } var sd:int=0; var xm:int=0; function Update () { if(gameObject.transform.position.y<0) { xm=++gameObject.Find("Main

SpringBoot自学笔记(四)

SpringBoot自学笔记(四) 特此声明:本自学笔记,主要是参照<从零开始学Spring Boot>(作者: 林祥纤)一书,并对部分例子进行了改动,便于理解,非盈利为目的,仅供学习交流,如有侵权,立即撤下!  历史笔记链接:<SpringBoot自学笔记(一)>   历史笔记链接:<SpringBoot自学笔记(二)>   历史笔记链接:<SpringBoot自学笔记(三)>  (七)Srping Boot--使用JdbcTemplate及修改Sprin

SpringBoot自学笔记(三)

SpringBoot自学笔记(三) 特此声明:本自学笔记,主要是参照<从零开始学Spring Boot>(作者: 林祥纤)一书,并对部分例子进行了改动,便于理解,非盈利为目的,仅供学习交流,如有侵权,立即撤下!  历史笔记链接:<SpringBoot自学笔记(一)>   历史笔记链接:<SpringBoot自学笔记(二)>  (六)Srping Boot--整合Mysql及Hibernate 1.新建Maven工程,博主以"spring-boot-databa