zoukankan      html  css  js  c++  java
  • 使用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;

    编译运行。

     

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

    我们今天的任务完成了。

  • 相关阅读:
    软件测试原则
    java知识点
    jquery取值
    Javaweb命名规则
    @ResponseBody
    jquery ajax 方法及各参数详解
    @RequestMapping用法详解
    eclipse+android+opencv环境搭建的步骤
    Java中的内部类(回调)
    OpenCV直方图(直方图、直方图均衡,直方图匹配,原理、实现)
  • 原文地址:https://www.cnblogs.com/xalion/p/6683165.html
Copyright © 2011-2022 走看看