0

我正在使用 Delphi XE2 Update 4 Indy 10

我有一个用 idHttpServer 实现的 web 服务,它回答传统的 Http Get 请求,我只与从 URI 检索到的变量进行交互。

这个网络服务器已经为局域网等内置了许多其他功能。所以我正在考虑让它比迁移到一个新平台更好。

并发访问的数量非常少:每次最多 5 个。Web 服务从 SQL 服务器检索数据并使用 JSON 进行应答。

我想以可以描述和检索的方式重写此服务器的服务提供。很像 DCOM Iunknown 和 Idispatch 功能。我不需要它是像 WSDL 这样的公共完全实现的语言。

对我来说,架构的 RESTful 风格比与 SOAP 相关的任何东西都更接近我所拥有的。

我读到一点,datasnap 有一个 Indy 核心选项并且可以做 RESTful 但是我不想使用 Apache 或 IIS,我想成为一个普通的 Windows 应用程序。我听说过太多关于 DataSnap 的坏事……

我已经阅读了关于 AtomPub 和 RSDL 的内容,我不了解其他人,但我需要在 delphi 上有一些代码才能开始使用它。

我的问题:我应该使用哪种描述语言才能找到组件/示例以快速开始将它与我的 idHttpServer 服务器一起使用?

4

1 回答 1

2

您的服务的描述语言可能是 Delphiinterface本身。由于您不需要发布它,因此它是一个安全且简单的解决方案。

考虑到您的要求:

我想以可以描述和检索的方式重写此服务器的服务提供。很像 DCOM Iunknown 和 Idispatch 功能。我不需要它是像 WSDL 这样的公共完全实现的语言。

您可以考虑使用我们基于开源mORMot 接口的服务来发布和使用您的服务。

他们在 HTTP 和 REST 上使用 JSON,并且几乎所有操作都是自动化的。您只需要使用将用作服务合同interface的 plain定义您的服务:

type
  ICalculator = interface(IInvokable)
    ['{9A60C8ED-CEB2-4E09-87D4-4A16F496E5FE}']
    /// add two signed 32 bit integers
    function Add(n1,n2: integer): integer;
  end;

然后在服务器端,将其实现为常规的 Delphi 类

type
  TServiceCalculator = class(TInterfacedObject, ICalculator)
  public
    function Add(n1,n2: integer): integer;
  end;

function TServiceCalculator.Add(n1, n2: integer): integer;
begin
  result := n1+n2;
end;

 Server.ServiceRegister(TServiceCalculator,[TypeInfo(ICalculator)],sicShared);

您在客户端使用服务,无需生成任何包装器:

var I: ICalculator;
begin
  if Client.Services['Calculator'].Get(I)) then
    result := I.Add(10,20);
end;

mORMot服务器在设计上是独立的(不需要 IIS 或 Apache),您可以将它们作为应用程序或服务运行。你有额外的特性,比如安全性、身份验证或会话处理,并且性能非常好。从 Delphi 6 到 XE4,针对 Win32 和 Win64 平台。

PS:

您甚至可以设置TServiceContainerServer.PublishSignature := true并使用_signature_伪方法来检索简单的 JSON 签名:

[
    {
    "contract":"Calculator",
    "implementation":"shared",
    "methods":
        [
            {
            "method":"Add",
            "arguments":
                [
                    {"argument":"Self","direction":"in","type":"self"},
                    {"argument":"n1","direction":"in","type":"integer"},
                    {"argument":"n2","direction":"in","type":"integer"},
                    {"argument":"Result","direction":"out","type":"integer"}
                ]
            }
        ]
    }
]
于 2013-09-09T07:05:32.973 回答