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,后来发现内容太长,这样我们放在下一篇专门介绍