前几天做了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;
编译运行。
可以看见,客户端很顺利的调用了服务器端的函数。
我们今天的任务完成了。