處理REST SOE請求

孫群發表於2013-01-27

關於處理REST SOE請求

SOE的schema中的每個資源和操作都需要繫結一個請求處理函式。該函式包含了請求資源或呼叫操作的時候的邏輯程式碼。這些處理函式是你編寫大部分ArcObjects程式碼的地方。

在REST SOE模板中,已經為你寫好了一個資源的請求處理函式RootResHandler()。作為示例,它返回了一個簡單的"hello:world" JSON字串。你可以拷貝RootResHandler程式碼並對其進行修改以便使其滿足schema中的其他資源。

資源的處理函式的結構是通過SOESupport庫中的.Net委託定義的。這意味著所有的資源請求函式含有相同的簽名,如下所示:

[C#]

private byte[] RootResHandler(NameValueCollection boundVariables, string
    outputFormat, string requestProperties, out string responseProperties)
{
    ...
}

REST SOE模板中也包含了一個操作的處理函式SampleOperHandler()。這個簡單的示例函式將兩個字串引數“parm1”和“parm2”進行反序列化,並以JSON的形式將其原封不動的作為輸出結果進行返回。你可以拷貝改程式碼並對其進行修改以便使其滿足schema中的其他操作。

正如資源的處理函式一樣,操作的處理函式的簽名也是由委託定義的。二者的委託很相似,唯一的區別是操作的處理函式的委託JSON物件的輸入引數。這個JSON物件包含了執行該操作所需的所有的引數,比如當呼叫buffer操作的時候,這個JSON物件可能包含一個點以及距離資訊。示例程式碼如下:

[C#]

public delegate byte[] OperationHandler(NameValueCollection boundVariables,
    JsonObject operationInput, string outputFormat, string requestProperties, out
    string responseProperties);

當在編寫操作的處理函式程式碼的時候,你所應該注意的是你需要將JSON輸入進行反序列化,然後用ArcObjects或其他庫進行處理,最後將你的結果序列化稱JSON。對JSON進行反序列化以及序列化是最有技巧的一部分。

以非JSON的形式返回結果

有時候可能你需要Web服務以非JSON得形式返回結果,比如返回圖片。在這種情況下,你需要在response的屬性中設定HTTP響應的Content-Type頭。

首先,當定義資源或操作的時候,設定支援的輸出格式。下面的程式碼定義了一個返回png圖片的操作。

[C#]

RestOperation pngOper = new RestOperation("generatePng", null, new string[]
{
    "png"
}

, PngHandler);
soeResource.operations.Add(pngOper);

當你定義處理函式的時候,設定最後一個引數responseProperties為你所需要的的Content-Type頭的JSON格式。在如下的例子中, content type是image/png。

[C#]

private byte[] PngHandler(System.Collections.Specialized.NameValueCollection
    boundVariables, ESRI.ArcGIS.SOESupport.JsonObject operationInput, string
    outputFormat, string requestProperties, out string responseProperties)
{
    responseProperties = 
        "{\"Content-Type\" : \"image/png\",\"Content-Disposition\": \"attachment; filename=response.png\"}";
    // Add code to generate and return a PNG.
}

上述技巧也可用於返回其他資料格式,比如JPG或XML。

相關文章