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,后来发现内容太长,这样我们放在下一篇专门介绍
在上一篇博客中,我们已经在程序中添加了两个服务,一个是切片地图服务,另一个是三维场景服务。 这篇博客则会从整体上介绍几种常用服务的使用方式。 先解释两个名词:服务、图层 服务:服务器对外提供功能的单元 图层:应用程序组织要素的单元 服务和图层,表现在程序中是这样的: 其中http://services.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer是服务,ArcGISTiledLayer是图层。
相关文章
- 为wordpress增加function模板应用-以后不用修改模板函数添加扩展功能
- 总结篇,IOC,Bean的生命周期,三大扩展点
- Windows php 7.* -nts 安装 redis扩展遇到的问题
- 欧几里得扩展模板--------------------------C语言——菜鸟级
- JMeter 扩展插件实现对自定义协议的支持
- JMeter 扩展开发:自定义 JMeter 插件的调试
- composr require 下载扩展包
- PHP ImageMagick扩展有哪些函数?PHP ImageMagick扩展的使用方法
- 【Groovy】Groovy 扩展方法 ( 实例扩展方法配置 | 扩展方法示例 | 编译实例扩展类 | 打包实例扩展类字节码到 jar 包中 | 测试使用 Thread 实例扩展方法 )
- 扩展 安装如何正确安装Oracle中的包扩展(oracle中包)
- 混合云构建弹性可扩展的N5100 Linux混合云(n5100linux)
- 介绍Linux虚拟机拓展介绍(虚拟机linux扩展)
- MySQL中使用UDF函数进行扩展,该UDF是什么详解MySQL中UDF函数的概念和用法(mysql中udf是什么)
- Redis集群实现空间扩容增加服务器实现突破(redis集群加机器扩展)
- Dictionary扩展基础类向字典中添加键和值
- PHP添加Xdebug扩展的方法