现在的位置: 首页 > 综合 > 正文

web服务接口实例

2013年12月10日 ⁄ 综合 ⁄ 共 2865字 ⁄ 字号 评论关闭

(DELPHI7)

服务端:

步骤1: File>New>Other>New(选项)>WebServer Application

步骤2: 将新生成TWebModule页面命名为SOAP,单元保存为uMain.pas,工程保存为:SOAP_Server.dpr 。

步骤3:往SOAP页面放三个控件

HTTPSoapDispatcher1: THTTPSoapDispatcher;
HTTPSoapPascalInvoker1: THTTPSoapPascalInvoker;
WSDLHTMLPublish1: TWSDLHTMLPublish;

将 HTTPSoapDispatcher1.Dispatcher:= HTTPSoapPascalInvoker1 ;

步骤4:编写接口,可直接在uMain.pas单元编写,也可在其它单元编写。此处只定义一个接口,名字为:IGetServer,方法名为: GetServerName 

定义:

type
IGetServer = interface(iinvokable)
['{ACF7DE43-3AAC-4BE2-8A03-456AF55EE8ED}']
function GetServerName():string;stdcall;
end;

TIGetServer = class(TInvokableClass, IGetServer)
function GetServerName():string;stdcall;
end;

实现:

function TIGetServer.GetServerName():string;stdcall;
begin
Result := 'this is a test SOAP SERVER';
end;

步骤5:选中SOAP,单击Actions生成一个Action,并命名为:DefaultHandler,onAction代码为:

procedure TSOAP.SOAPDefaultHandlerAction(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
WSDLHTMLPublish1.ServiceInfo(Sender, Request, Response, Handled);
end;

步骤6:在单元后面加上注册接口:

initialization;
InvRegistry.RegisterInterface(TypeInfo(IGetServer));
InvRegistry.RegisterInvokableClass(TIGetServer);

步骤7:编译生成dll,此工程生成的DLL为SOAP_Server.dll

步骤8:部署WEB服务,将生成的 SOAP_Server.dll放到IIS的根目录下,即 C:/Inetpub/wwwroot

步骤9:设置执行权限:开始>控件面板>管理工具>Internet信息服务>默认网站,右键>属性>主目录>执行权限,选【脚本和可执行文件】 >应用

客户端:

步骤1:新建一工程。单元保存为uMain.pas,工程保存为:SOAP_Client.dpr

步骤2:定义一个与服务端一样的接口,接口GUID要重新生成,同样需要注册接口;

步骤3:定义一个取数据的函数

步骤4:调用该函数取回数据。

完整代码如下所示 :

unit uMain;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, InvokeRegistry, Rio, SOAPHTTPClient;

type
IGetServer = interface(iinvokable)
['{58CB7B95-4FA2-4555-9886-81B093419F1C}']
function GetServerName():string;stdcall;
end;

function GetIGetServer(UseWSDL :Boolean=system.False; Addr :string=''):IGetServer;

type
TForm1 = class(TForm)
edt_Result: TEdit;
btn_GetServerData: TButton;
HTTPRIO1: THTTPRIO;
procedure btn_GetServerDataClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

function GetIGetServer(UseWSDL :Boolean=system.False; Addr :string=''):IGetServer;
const
defWSDL = 'http://localhost/SOAP_Server.dll/wsdl/IGetServer';
defURL = 'http://localhost/SOAP_Server.dll/soap/IGetServer';
defSvc = 'IGetServerservice';
defPrt = 'IGetServerPort';
var
RIO :THTTPRIO;
begin
Result := nil;
if Addr = '' then
begin
if UseWSDL then
Addr := defWSDL
else
Addr := defURL;
end;
RIO := THTTPRIO.Create(nil);
try
if UseWSDL then
begin
RIO.WSDLLocation := Addr;
RIO.Service := defSvc;
RIO.Port := defPrt;
end
else
RIO.URL := Addr;
Result := (RIO as IGetServer);
finally
if Result = nil then
RIO.Free;
end;
end;

procedure TForm1.btn_GetServerDataClick(Sender: TObject);
var
_IGetServer :IGetServer;
begin
_IGetServer := GetIGetServer(false, '');
edt_Result.text := _IGetServer.GetServerName()
end;

initialization
InvRegistry.RegisterInterface(TypeInfo(IGetServer), 'urn:uMain-IGetServer', '');
InvRegistry.RegisterDefaultSOAPAction(TypeInfo(IGetServer), 'urn:uMain-IGetServer#GetServerName');

end.

 

发表地:广州

抱歉!评论已关闭.