对于使用TidHttpServer实现的Web服务器,我应该使用哪种描述语言?

时间:2013-09-09 00:30:51

标签: web-services delphi rest indy

我正在使用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服务器?

1 个答案:

答案 0 :(得分:2)

您的服务的描述语言可能是Delphi interface本身。由于您不需要发布它,因此它使其成为一种安全且简单的解决方案。

考虑您的要求:

  

我想以这种方式重写此服务器的服务   可以描述和检索。非常像DCOM Iunknown   和Idispatch功能。我不需要它是一个公众满满的   实现了像WSDL这样的语言。

您可以考虑使用我们的开源 mORMot interface-based services来发布和使用您的服务。

他们使用JSON over HTTP和REST,几乎所有都是自动化的。您只需要使用will be used as service contracts

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

然后on the server side, you implement it as a regular Delphi class

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);

而且you consume the services on the client side不需要生成任何包装器:

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"}
                ]
            }
        ]
    }
]