Delphi XE2:如何定义自定义DataSnap REST URI?

时间:2012-05-12 09:17:17

标签: delphi rest delphi-xe2 datasnap

我正在使用Delphi XE2编写DataSnap REST服务。我注意到DataSnap中的REST URI必须严格遵循这种格式(参考here):

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

一个着名的例子是由DataSnap服务器向导创建的示例方法:

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

在URI中提供参数有两种常用方法:

  1. 路径段参数:/ TServerMethods1 / ReverseString / ABC
  2. 查询字符串参数:/ TServerMethods1 / customers?name = bill
  3. DataSnap REST肯定支持Path Segment参数URI。 DataSnap REST中是否支持查询字符串参数URI?

    我有以下REST URI示例,发现似乎无法使其与当前的DataSnap REST库一起使用:

    1. /客户/ A1234

      返回ID A1234的客户对象

    2. /customers/A1234.xml

      以XML格式返回ID A1234的客户对象

    3. /customers/A1234.json

      以json格式返回ID A1234的客户对象

    4. /customers/A1234.html

      以html格式返回ID A1234的客户对象

    5. /客户?名称=比尔

      返回名称中包含Bill

    6. 的客户列表

2 个答案:

答案 0 :(得分:5)

我不知道如何使用DataSnap来实现它,但有很多方法可以解决它。您可以将名为URLRewrite的东西用于此,因为友好的URI和Da​​taSnap所需的URI都可以轻松映射。

对于IIS,您可以使用(启用)IIS 7中标准的URLRewrite模块。更多信息可以在官方网站上找到:http://www.iis.net/download/urlrewrite

请务必为inbound outbound URI创建规则,以便“内部”(Datasnap)URI不会流入野外。

如果您在Apache上运行该站点,可以使用类似的功能,而且我需要修改.htaccess文件,但我没有使用Apache的经验,所以我可能错了。

答案 1 :(得分: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;