2012-05-12 53 views
10

我正在使用Delphi XE2編寫DataSnap REST服務。我注意到,REST URI中的DataSnap必須嚴格按照此格式(參見here):Delphi XE2:如何定義自定義DataSnap REST URI?

http://my.site.com/datasnap/rest/URIClassName/URIMethodName[/inputParameter]* 

一個著名的例子是抽樣方法,通過DataSnap服務器嚮導創建:

http://my.site.com/datasnap/rest/TServerMethods1/ReverseString/ABC 

有2點常用的方法在URI供應參數:

  1. 路徑細分參數:/ TServerMethods1/ReverseString/ABC
  2. 查詢列p參數:/ TServerMethods1/customers?name = bill

DataSnap REST明確支持Path Segment參數URI。 DataSnap REST中的查詢字符串參數URI是否也支持?

我有以下REST URI例如,發現它似乎是不可能的,使其與當前的DataSnap REST庫工作:

  1. /客戶/ A1234 ID A1234

    回報客戶對象

  2. /customers/A1234.xml

    ID A1234的

    返回客戶對象以XML格式JSON格式ID A1234的

  3. /customers/A1234.json

    返回客戶對象

  4. /customers/A1234.html

    以html格式返回ID A1234的客戶對象

  5. /客戶?名稱=比爾

    回報名字中含有單客戶名單

回答

5

我不知道如何使用的DataSnap做到這一點,但也有它周圍的方式。你可以把一些叫做URLRewrite的東西用在這裏,因爲你友好的URI和Da​​taSnap所要求的都很容易映射。

對於IIS,您可以使用(啓用)IIS 7中標準的URLRewrite模塊。更多信息可在官方網站上找到:http://www.iis.net/download/urlrewrite

一定要爲創建規則inboundoutbound的URI,使「內部」(的DataSnap)的URI不出去到野外。

如果您在Apache上運行該站點,可以使用類似的功能,而且我需要修改.htaccess文件,但是我沒有使用Apache的經驗,所以我可能是錯的。

+1

如果Rest APP要在多個站點上部署,那將是單調乏味的。 –

+0

@ChauCheeYang:爲什麼?這只是web.config中的一些規則。您不需要使用IIS管理器來編輯它們,您可以直接將它們直接添加到網站的web.config中,或者讓安裝腳本爲您執行此操作。 –

3

晚會有點晚,但是可以使用查詢參數。

你必須使用GetInvocationMetadata.QueryParams

見下面的例子。

uses DBXPlatform; 

function TServerMethods1.EchoString(Value: string): string; 
var 
    metaData: TDSInvocationMetadata; 
    i: integer; 
begin 
    metaData := GetInvocationMetadata; 
    for i := 0 to Pred(metaData.QueryParams.Count) do 
    begin 
    Result := Result + '<param>' + metaData.QueryParams[i] + '</param>'; 
    end; 
    metaData.ResponseContent := '<xml>' + Result + '</xml>'; 
end; 
+0

您不使用TDSInvocationMetadata.Create()...它是否正確? –

+0

http://docwiki.embarcadero.com/Libraries/XE2/en/Data.DBXPlatform.GetInvocationMetadata這是你自己不應該創建的東西,所以是的,它是正確的 – Patrick