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

10

我正在使用Delphi XE2编写DataSnap REST服务。 我注意到在DataSnap中,REST URI必须严格遵循此格式(请参见此处):

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

数据快照(DataSnap) REST肯定支持路径段参数的URI。那么查询字符串参数的URI在DataSnap REST中也被支持吗?

我有以下REST URI示例,并且发现它似乎不能与当前的DataSnap REST库一起使用:

  1. /customers/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. /customers?name=Bill

    返回包含名称为Bill的客户列表

2个回答

5
我不知道如何使用DataSnap完成此操作,但有其他方法。您可以使用称为URLRewrite的东西来实现此目的,因为友好的URI和DataSnap所需的URI都很容易映射。
对于IIS,您可以使用(启用)标准IIS 7中的URLRewrite模块。更多信息可以在官方网站上找到:http://www.iis.net/download/urlrewrite
一定要为inboundoutbound URI创建规则,以便“内部”(Datasnap)URI不会泄露出去。
如果您在Apache上运行站点,则可以使用类似的功能,并且我认为您需要修改.htaccess文件,但我没有Apache的经验,所以可能有所不同。

2
如果要在许多站点上部署Rest APP,那将会很繁琐。 - Chau Chee Yang
@ChauCheeYang:为什么?这只是在web.config中添加几个规则而已。您不需要使用IIS管理器来编辑它们,您可以直接将它们添加到站点的web.config中,或者让安装脚本为您完成。 - Marjan Venema

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;

你没有使用 TDSInvocationMetadata.Create() ... 这样正确吗? - Sebastian Xawery Wiśniowiecki
http://docwiki.embarcadero.com/Libraries/XE2/zh/Data.DBXPlatform.GetInvocationMetadata 这是你自己不应该创建的东西,所以是正确的。 - Patrick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接