在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
前几天做了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; 编译运行。
可以看见,客户端很顺利的调用了服务器端的函数。 我们今天的任务完成了。
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论