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

1、CreateRESTSchema()和Handle function

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

  在REST SOE模板中,有一个处理resource逻辑的RootRESTHandler函数,他返回一个简单的JSON格式的字符串

  一个resource的handler function实际上是一个在SOESupport类库中的代理(delegate),这意味着所有的resource的处理函数都有一个类似的函数签名。

 

  在REST SOE模板中包含了一个Operation的handler function。在此例中,该函数反序列化了两个字符串参数‘param1’和‘param2’,并且把它们作为JSON格式对象返回给客户端。

  同resource的处理函数一样,Operation的处理函数也是一个代理。该方法中出了一个OperationInput参数外,与resource处理函数一样。operationInput中包含了该operation中需要的参数。比如当你想要实现缓冲区查询时,该对象会包含一个point和distance参数。

  在该函数中另一个需要关心的问题是,如何反序列化输入的JSONObject和将得到的结果序列化成客户端能接受的JSON数据。反序列化和序列化JSONObject有时是个很棘手的问题。(稍后介绍)

 

  有时候我们需要向客户端返回一些非JSON数据,比如图片。我们可以通过改变HTTP协议的Content-Type属性实现

  (1)我们要在实例化RESTOperation时设置它的SupportFormat参数

  (2)在handler function中设置responseProperties参数

 

2.处理JSONObject

  大多数情况下,客户端和服务器都是通过JSON格式数据进行REST通信。所以,你的handler function必须能够反序列化JSON数据,提取其中有效值进行业务处理,在处理执行完毕后将结果序列化成JSON数据。

  反序列化JsonObject:

  问题在于AO中无法直接利用JSON数据,幸好ESRI为我们提供了SOESupport类库,该库中提供了一系列的方法来解决这个问题。当客户端发送请求时,JSON数据被作为一个SOESupport.JsonObject的实例传入到handler function中,处理完后将结果作为JsonObject返回给客户端。

 

  在上面函数中包含一个JsonObject类型的参数operationInput,它包含了我们需要的参数。上面代码中使用TryGetString方法将param1转换为string类型。在JsonObject中还包含以下方法:

  使用“TryGet”方法我们能够提取Json类型的参数值,并将其转化成你所定义的变量。可以用这些变量来定义你的AO类型数据。如果我们需要将JSON数据反序列化成geometries类型数据,SOESupport类库中为我们提供了SOESupport.Conversion.ToGeometry方法,该方法需要一个JsonObject类型或者string作为输入参数,并返回一个IGeometry类型变量。如下代码将一个JsonObject转换为IPoint:

  强调一下,上述代码中的错误检查是必须的,如果Json数据无法构成IPoint类型,会抛出一个异常。比如{x:-123, y:47}这个Json格式数据可以成功转换为IPoint,而{x:-123}则会抛出一个异常。

 

  序列化JsonObject:

   当我们的业务逻辑被执行完后,我们需要将结果序列化成JsonObject类型,并返回给客户端。这里我们依旧可以使用JsonOject类,看以下代码:

  上述代码中,如果parm1Value的值为“myFirstParameter”,该函数执行后得到的Json格式对象为“{"param1": "myFirstParameter"}”。该类中还有以下方法来构造json数据:

  有的Geometry对像由于含有子对象或数组,序列化为Json数据时比较棘手,这时我们可以使用SOESupport.Conversion.ToJsonObject方法,该函数接受一个实现了IGeometry类型的对象,并将其序列化为Json对象。如下代码:

执行后所构成如下Json数据:

以上就是本片内容,本来打算详细介绍一下Schema、Resource和Operation,后来发现内容太长,这样我们放在下一篇专门介绍

时间: 2024-09-25 01:17:01

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

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)新手自学笔记(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

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---可以从服务器

运行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