ArcGIS 服務對象擴展(SOE)新手自學筆記(4):Schema、Resource、Operation


  前面幾節我們介紹了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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM