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,后來發現內容太長,這樣我們放在下一篇專門介紹