新建一个工程。选择如图。
 
    
    
    
    
   继续输入服务名
然后就生成对应的单元。
 
   增加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:=;
  for i :=  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().tostring);
end; 
    
   








![[qiankun+nuxt]子应用请求本地文件报错404](https://img-blog.csdnimg.cn/3b92afcf06a84e25ad8c6e75e2f9d452.png)









