使用delphi 10.2 开发linux 上的webservice

前几天做了linux下apache的开发,今天做一个linux 下的webservice ,以供客户端调用。

闲话少说,直接干。

新建一个工程。选other...,选择如图。

继续输入服务名

然后就生成对应的单元。

 增加linux 平台。

完善对应的单元代码

{ Invokable implementation File for Txaliontest which implements Ixaliontest }

unit xaliontestImpl;

interface

uses Soap.InvokeRegistry, System.Types, Soap.XSBuiltIns, xaliontestIntf;

type

  { Txaliontest }
  Txaliontest = class(TInvokableClass, Ixaliontest)
  public

    function echoname(const Value:string):string; stdcall;
    function sumall(const Value:integer):integer; stdcall;

  end;

implementation


{ Txaliontest }

function Txaliontest.echoname(const Value: string): string;
begin
   result:='你好'+value;
end;

function Txaliontest.sumall(const Value: integer): integer;
var
  i:integer;
  isumall:integer;
begin
  isumall:=0;
  for i := 1 to value do
   isumall:=isumall+i;

  result:=isumall;
end;

initialization
{ Invokable classes must be registered }
   InvRegistry.RegisterInvokableClass(Txaliontest);
end.
{ Invokable interface Ixaliontest }

unit xaliontestIntf;

interface

uses Soap.InvokeRegistry, System.Types, Soap.XSBuiltIns;

type

  { Invokable interfaces must derive from IInvokable }
  Ixaliontest = interface(IInvokable)
  ['{20590E4A-BF8C-41AE-A630-94D2DD38EEE1}']

    { Methods of Invokable interface must not use the default }
    { calling convention; stdcall is recommended }
      function echoname(const Value:string):string; stdcall;
    function sumall(const Value:integer):integer; stdcall;
  end;

implementation

initialization
  { Invokable interfaces must be registered }
  InvRegistry.RegisterInterface(TypeInfo(Ixaliontest));

end.

编译本工程。

哎呀,怎么出错了?

不要害怕,这是因为linux 上apache的引用没有加入。我们确认apache 已经在linux上安装成功。

那么我们在IDE 里面处理一下。

记住设以上的地方为True, 允许未定义的引用。

现在重新编译

哈哈,OK 了

现在的任务就是在发布这个apache 模块。

这一块的内容请参照前面的文章。

配置文件如图:

启动apache.

 在浏览器里面输入对应的地址,就可以显示webservice 的接口信息了。

 好了,服务端搞定了。我们做一个客户端来调用一下这个服务。

直接建一个vcl application .

然后选择WDSL 导入器。

输入对应的地址。

 系统会生成对应的接口文件

// ************************************************************************ //
// The types declared in this file were generated from data read from the
// WSDL File described below:
// WSDL     : http://192.168.1.66/xalionws/wsdl/Ixaliontest
// Encoding : utf-8
// Version  : 1.0
// (2017-4-8 21:33:51 - - $Rev: 90173 $)
// ************************************************************************ //

unit Ixaliontest1;

interface

uses Soap.InvokeRegistry, Soap.SOAPHTTPClient, System.Types, Soap.XSBuiltIns;

type

  // ************************************************************************ //
  // The following types, referred to in the WSDL document are not being represented
  // in this file. They are either aliases[@] of other types represented or were referred
  // to but never[!] declared in the document. The types from the latter category
  // typically map to predefined/known XML or Embarcadero types; however, they could also 
  // indicate incorrect WSDL documents that failed to declare or import a schema type.
  // ************************************************************************ //
  // !:int             - "http://www.w3.org/2001/XMLSchema"[]
  // !:string          - "http://www.w3.org/2001/XMLSchema"[]


  // ************************************************************************ //
  // Namespace : urn:xaliontestIntf-Ixaliontest
  // soapAction: urn:xaliontestIntf-Ixaliontest#%operationName%
  // transport : http://schemas.xmlsoap.org/soap/http
  // style     : rpc
  // use       : encoded
  // binding   : Ixaliontestbinding
  // service   : Ixaliontestservice
  // port      : IxaliontestPort
  // URL       : http://192.168.1.66/xalionws/soap/Ixaliontest
  // ************************************************************************ //
  Ixaliontest = interface(IInvokable)
  ['{A3FB1A48-1AE7-B449-16DC-42CCE1A48832}']
    function  echoname(const Value: string): string; stdcall;
    function  sumall(const Value: Integer): Integer; stdcall;
  end;

function GetIxaliontest(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): Ixaliontest;


implementation
  uses System.SysUtils;

function GetIxaliontest(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): Ixaliontest;
const
  defWSDL = 'http://192.168.1.66/xalionws/wsdl/Ixaliontest';
  defURL  = 'http://192.168.1.66/xalionws/soap/Ixaliontest';
  defSvc  = 'Ixaliontestservice';
  defPrt  = 'IxaliontestPort';
var
  RIO: THTTPRIO;
begin
  Result := nil;
  if (Addr = '') then
  begin
    if UseWSDL then
      Addr := defWSDL
    else
      Addr := defURL;
  end;
  if HTTPRIO = nil then
    RIO := THTTPRIO.Create(nil)
  else
    RIO := HTTPRIO;
  try
    Result := (RIO as Ixaliontest);
    if UseWSDL then
    begin
      RIO.WSDLLocation := Addr;
      RIO.Service := defSvc;
      RIO.Port := defPrt;
    end else
      RIO.URL := Addr;
  finally
    if (Result = nil) and (HTTPRIO = nil) then
      RIO.Free;
  end;
end;


initialization
  { Ixaliontest }
  InvRegistry.RegisterInterface(TypeInfo(Ixaliontest), 'urn:xaliontestIntf-Ixaliontest', 'utf-8');
  InvRegistry.RegisterDefaultSOAPAction(TypeInfo(Ixaliontest), 'urn:xaliontestIntf-Ixaliontest#%operationName%');

end.

在主窗体放两个按钮。

代码如下

implementation

{$R *.dfm}

uses Ixaliontest1;

procedure TForm2.Button1Click(Sender: TObject);
begin
  showmessage(  GetIxaliontest.echoname('xalion'));
end;

procedure TForm2.Button2Click(Sender: TObject);
begin
  showmessage(  GetIxaliontest.sumall(100).tostring);
end;

编译运行。

 

可以看见,客户端很顺利的调用了服务器端的函数。

我们今天的任务完成了。

原文地址:https://www.cnblogs.com/xalion/p/6683165.html