zl程序教程

您现在的位置是:首页 >  后端

当前栏目

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

扩展模板笔记对象服务 自学 新手 rest
2023-09-14 08:58:00 时间

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是图层。