前面幾節我們介紹了SOE基本概念、REST SOE模板以及如何處理輸入輸出數據。今天詳細介紹一下SOE中三個重要概念:Schema、Resource、Operation。
1.Schema
SOE中的Resource和Operation所組成的結構就是Schema,也可以說Shcema確定了SOE中Resource和Operation的層次結構。通常由IRESTRequestHandler接口的GetSchema()方法來返回該SOE的Schema,作為一個JSON格式的字符串被返回。在REST API中可以通過講一個http請求的參數設置為“f=schema”來獲取Schema。
下面我們來看幾個Schema的例子
Schema1 只有一個Operation
{ "operations" : [ "buffer", "near" ] }
在該例子中,SOE之暴露了一個Operation,從REST API角度來講,這個SOE之暴露了兩個URL。SOE跟資源和Buffer Operation:
http://<service-url>/exts/<extensionName> //root SOE resource http://<service-url>/exts/<extensionName>/buffer //buffer operation
Schema2 有多個Operation
{ "operations" : [ "buffer", "near" ] }
在該Schema中Operation是一個數組,所以可以指定多個操作。從REST API角度來講,這個SOE暴露了三個URL、SOE跟資源、Buffer和near操做:
http://<service-url>/exts/<extensionName> //root SOE resource http://<service-url>/exts/<extensionName>/buffer //buffer operation http://<service-url>/exts/<extensionName>/near //near operation
Schema3 具有參數的Operation和它指定的參數以及輸出格式
{ "operations" : [ { "name" : "buffer", "parameters" : ["location", "distance"], "supportedOutputFormats" : ["json", "amf"] }, { "name" : "near", "parameters" : ["location", "distance", "lookingFor"], "supportedOutputFormats" : ["json"] } ] }
它同Schema2暴露的URL是一樣的,區別在於它不僅制定了Operation的名稱,還有一些Operation的附屬信息,稍后我們會繼續討論這種Schema。
Schema 4 子Resource
{ "name" : "MyMapServiceExtension", "operations" : ["export", "identify"], "resources" : [ { "name" : "metadata" }, { "name" : "layers", "isCollection" : true, "operations" : ["query"], "resources" : [ { "name" : "features", "isCollection" : true } ] } ] }
該Schema中除了Operation外,還指定了它的子Resource。該SOE包含兩個根級Operation:export和identify,同時也包含了兩個子資源: metadata和layers。
metadata資源可以通過以下URL獲得:
http://<service-url>/exts/<extensionName>/metadata
注意到layers是一個Collection Resource(集合資源,因為其isCollection屬性為true),可以通過以下URL訪問它的子圖層資源:
http://<service-url>/exts/<extensionName>/layers/<layerId>
同時,每一個圖層都支持query操作,如下URL:
http://<service-url>/exts/<extensionName>/layers/<layerId>/query
每一個圖層中又包含了features子資源。features也是一個集合資源,每個特定的feature可以通過以下URL訪問:
http://<service-url>/exts/<extensionName>/layers/<layerId>/features/<featureId>
2.Resource
所有的SOE服務最少支持一個根級的Resource和Operation,如果Schema指定的話也可以包含子資源。
REST handler經常會從SOE中獲取一個resource的json表達。如果客戶端使用“f=json”開請求一個resource,SOE將會以json格式發送到客戶端。另一方面,如果使用Services Directory顯示的話,通常會將json轉換為html形式顯示在網頁上。
現在假定通過SOE返回的json格式的根資源如下:
{
"description: "Contitental US",
"extent" : { "xmin" : ..., "ymin" : ..., ...},
"spatialReference" : {...},
...
"layers" : [
{ "id" : 0, "name" : "Cities", ... },
{ "id" : 1, "name" : "Counties", ... },
{ "id" : 2, "name" : "States", ... }
]
...
}
當其在Services Directory中顯示時,Rest handler會發現一個“layers”屬性,由於他在Schema中被指定作為Collection Resource,將會首先檢查這個屬性(layers)的值是否是一個json數組,進一步檢查每個元素是否是一個具有id和name屬性的json對象。這樣將會用他的name作為顯示而將id放在放在URL連接中。點擊Cities時會獲得如下URL:
http://<service-url>/exts/<extensionName>/layers/0 //the Cities layer
在Services Directory中如下顯示:
使用REST API獲取一個SOE的resource,實際上是觸發了SOE中的handleRESTRequest方法。對於resource請求,該方法的OpeartionName參數將是一個空字符串,而resourceName參數是一個跟SOE的resource相關的字符串。下圖展示了在Schema4中對於不同的resource的REST請求,將被轉換成handleRequest觸發時的resourceName參數:
3.Operation
如果SOE的Schema中指定了某些resource支持Operation,該resource的Services Directory頁面將會顯示出Operation的鏈接。如:
在Schema2中之定義了一個Operation的名字,並沒有參數和返回格式信息,這時Services Directory通常會顯示一個form,用戶需要在此提供參數信息和值,在Schema中的buffer Operation將會如下顯示:
類似resource,用REST API發送Operation請求時也觸發了HandleRESTRequest方法。這時候operationName將是一個非空字符串,resourceName將是一個與SOE的resource有關聯的字符串。在Schema4中,發送不同的Operation請求,將被轉換成handleRESTRequest觸發時的resourceName和operationName:
REST客戶端會把operation參數作為query parameter放在URL中。在handleRESTRequest出發之前,REST handle將輸入參數強制轉換成json對象,參數名作為json對象的屬性名,參數值作為有意義的json對象值,如數字、bool、json對象、json數組,如果不能轉換成上述類型則轉換為字符串。handleRESTRequest中的outformat參數設置為“f”指定的類型。
http://<service-url>/exts/<extensionName>/near? location={x: -117.05, y: 34.11}&distance=2.5&&lookingFor=ATM&f=json
上述請求中,location參數將會被轉換成json對象,distance被轉換成數字,lookingFor將被轉換成string。在觸發handleRESTRequest方法之前,operationInput參數將被轉換成如下json對象:
{
"location" : {x: -117.05, y: 34.11}, //JSON object
"distance" : 2.5, //number
"lookingFor" : "ATM" //string
}
以上就是這節要說的內容,特別聲明一下,本篇內容並非原創,大部分內容參考了這篇文章:
http://atlas.resources.ca.gov/arcgis/SDK/REST/extension.html