您的位置:首页 > 运维架构 > Linux

使用delphi 10.2 开发linux 上的webservice

2017-04-08 21:42 253 查看
前几天做了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;


编译运行。





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

我们今天的任务完成了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: