qileilove

blog已经转移至github,大家请访问 http://qaseven.github.io/

精通软件性能测试与LoadRunner最佳实战 连载十三

 13.13.2  Delphi Web Services样例程序

  1.服务端

  为了使读者朋友对Web Services程序的开发过程有一个较清晰的认识,这里作者用Delphi给大家做一个简单样例程序。服务端用来提供对外服务接口,只有服务端运行后,其提供的服务接口才能被其他应用所调用,这里我们把调用其服务接口的程序统一叫客户端。

  首先,选择“SOAP Server Application”选项,如图13-110所示。

  单击【OK】按钮,则弹出图13-111所示对话框信息,我们选择 “ISAPI/NSAPI Dynamic Link Library”,单击【OK】按钮,弹出确认对话框,如图13-112所示,单击【Yes】按钮。

       

  图13-110  New Items对话框          图13-111  New SOAP Server Application对话框         图13-112  Confirm对话框

  将出现图13-113所示界面信息,您可以在对话框中输入服务名称,这里我们将该服务接口定义为“MyHello”,单击【OK】按钮,将产生相关的单元(Unit)文件,下面将附上相关文件的源代码供大家参考。

              

            图13-113  Confirm对话框                          图13-114  WebModule1对话框(对应单元文件为main.pas)

  main.pas源代码:

{ SOAP WebModule }
unit main;
interface
uses
SysUtils, Classes, HTTPApp, InvokeRegistry, WSDLIntf, TypInfo,
WebServExp, WSDLBind, XMLSchema, WSDLPub, SOAPPasInv, SOAPHTTPPasInv,
SOAPHTTPDisp, WebBrokerSOAP;
type
TWebModule1 = class(TWebModule)
HTTPSoapDispatcher1: THTTPSoapDispatcher;
HTTPSoapPascalInvoker1: THTTPSoapPascalInvoker;
WSDLHTMLPublish1: TWSDLHTMLPublish;
procedure WebModule1DefaultHandlerAction(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
private
{ Private declarations }
public
{ Public declarations }
end;
var
WebModule1: TWebModule1;
implementation
{$R *.dfm}
procedure TWebModule1.WebModule1DefaultHandlerAction(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
WSDLHTMLPublish1.ServiceInfo(Sender, Request, Response, Handled);
end;
end.

MyHelloImpl.pas源代码:

unit MyHelloImpl;

interface

uses InvokeRegistry, Types, XSBuiltIns, MyHelloIntf;

type

  { TMyHello }
  TMyHello = class(TInvokableClass, IMyHello)
  public
    function Welcome(name: string): string; stdcall;
  end;

implementation


function TMyHello.Welcome(name: string): string;
begin
  result := '欢迎' + name + '同学!' ;
end;

initialization
  { Invokable classes must be registered }
  InvRegistry.RegisterInvokableClass(TMyHello);

end.

MyHelloIntf.pas源代码:

unit MyHelloIntf;

interface

uses InvokeRegistry, Types, XSBuiltIns;

type

  TEnumTest = (etNone, etAFew, etSome, etAlot);

  TDoubleArray = array of Double;

  TMyEmployee = class(TRemotable)

  private

    FLastName: AnsiString;

    FFirstName: AnsiString;

    FSalary: Double;

  published

    property LastName: AnsiString read FLastName write FLastName;

    property FirstName: AnsiString read FFirstName write FFirstName;

    property Salary: Double read FSalary write FSalary;

  end;

  { Invokable interfaces must derive from IInvokable }

  IMyHello = interface(IInvokable)

    ['{F80D3129-3B13-49A7-8CCF-3DC3B120BA15}']

    { Methods of Invokable interface must not use the default }

    { calling convention; stdcall is recommended }

    function Welcome(name: string): string; stdcall;

  end;

implementation

initialization

  { Invokable interfaces must be registered }

  InvRegistry.RegisterInterface(TypeInfo(IMyHello));

end.

  接下来,您需要创建一个标准的“Application”,界面信息如图13-115所示。

  图13-115  样例演示-服务端(对应单元文件为u_main.pas)

  u_main.pas源代码:

unit u_main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, SUIButton, StdCtrls, ExtCtrls, SUIForm, IdHTTPWebBrokerBridge;
type
TForm1 = class(TForm)
sfrm1: TsuiForm;
lbl1: TLabel;
btn1: TsuiButton;
procedure btn1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure sfrm1Click(Sender: TObject);
private
{ Private declarations }
ser: TIdHTTPWebBrokerBridge;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses main, MyHelloImpl, MyHelloIntf;
{$R *.dfm}
procedure TForm1.btn1Click(Sender: TObject);
begin
close;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ser:=TIdHTTPWebBrokerBridge.Create(self);
ser.DefaultPort:=5678;
ser.Active:=true;
ser.RegisterWebModuleClass(TWebModule1);
end;
end.

  Server.dpr源代码:

program Server;
uses
Forms,
u_main in 'u_main.pas' {Form1},
main in 'main.pas' {WebModule1: TWebModule},
MyHelloImpl in 'MyHelloImpl.pas',
MyHelloIntf in 'MyHelloIntf.pas';
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TWebModule1, WebModule1);
Application.Run;
end.

  所有源代码编写完成后,单击“F9”运行程序,将弹出图13-116所示界面。

  如图13-116所示,“样例演示-服务端”小程序运行后,您可以打开IE,输入“http://localhost:5678/”来检验先前完成的服务是否可以成功展示,如图13-117所示。

        

  图13-116 “样例演示-服务端”小程序                      图13-117  服务接口相关信息         

    

13-118  样例演示-客户端 

   2.客户端

  最后,让我们来制作一个客户端小程序来调用先前完成的接口。

  创建一个标准的Delphi应用,其界面设计如图13-118所示。

  应用“WSDL Import Wizard”工具引入接口,如图13-119和图13-120所示。

       

  图13-119 “New Items-WSDL Importer”对话框                   图13-120 “WSDL Import Wizard”对话框

  引入服务接口后,将生成“IMyHello1.pas”单元文件,其源代码如下:

// ************************************************************************ //
// The types declared in this file were generated from data read from the
// WSDL File described below:
// WSDL     : http://localhost:5678/wsdl/IMyHello
// Encoding : utf-8
// Version  : 1.0
// (2012-11-11 下午 02:02:42 - 1.33.2.5)
// ************************************************************************ //
unit IMyHello1;
interface
uses InvokeRegistry, SOAPHTTPClient, Types, 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 Borland types; however, they could also
// indicate incorrect WSDL documents that failed to declare or import a schema type.
// ************************************************************************ //
// !:string          - http://www.w3.org/2001/XMLSchema
// ************************************************************************ //
// Namespace : urn:MyHelloIntf-IMyHello
// soapAction: urn:MyHelloIntf-IMyHello#Welcome
// transport : http://schemas.xmlsoap.org/soap/http
// style     : rpc
// binding   : IMyHellobinding
// service   : IMyHelloservice
// port      : IMyHelloPort
// URL       : http://localhost:5678/soap/IMyHello<
// ************************************************************************ //
IMyHello = interface(IInvokable)
['{FEDC3D83-ACE9-0403-6D1D-C1B54AA0B54C}']
function Welcome(const name: WideString): WideString; stdcall;
end;
function GetIMyHello(UseWSDL: Boolean = System.False; Addr: string = ''; HTTPRIO: THTTPRIO
= nil): IMyHello;
implementation
function GetIMyHello(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): IMyHello;
const
defWSDL = 'http://localhost:5678/wsdl/IMyHello';
defURL = 'http://localhost:5678/soap/IMyHello';
defSvc = 'IMyHelloservice';
defPrt = 'IMyHelloPort';
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 IMyHello);
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
InvRegistry.RegisterInterface(TypeInfo(IMyHello), 'urn:MyHelloIntf-IMyHello', 'utf-8');
InvRegistry.RegisterDefaultSOAPAction(TypeInfo(IMyHello),
'urn:MyHelloIntf-IMyHello#Welcome');
end.

  .Unit1.pas源代码:

unit Unit1;

interface

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, SUIButton, ExtCtrls, SUIForm, StdCtrls, SUIEdit;

type

  TForm1 = class(TForm)

    sfrm1: TsuiForm;

    btn1: TsuiButton;

    lbl1: TLabel;

    edt1: TsuiEdit;

    btn2: TsuiButton;

    lbl2: TLabel;

    lbl3: TLabel;

    procedure btn1Click(Sender: TObject);

    procedure btn2Click(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

var

  Form1: TForm1;

implementation

uses IMyHello1;

{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);

var

  I: IMyHello;

begin

  I := GetIMyHello;

  if Trim(edt1.Text) <> '' then begin

    lbl2.Caption := I.Welcome(edt1.Text);

    I := nil;

  end

  else begin

    Application.MessageBox('请输入姓名!', '系统信息', 0);

    Exit;

  end;

end;

procedure TForm1.btn2Click(Sender: TObject);

begin

  Close;

end;

end.

  在Delphi IDE环境,单击“F9”运行客户端程序,将弹出图13-121所示对话框。

后续内容请从书籍获得……

  (未完待续)

版权声明:51Testing软件测试网及相关内容提供者拥有51testing.com内容的全部版权,未经明确的书面许可,任何人或单位不得对本网站内容复制、转载或进行镜像。51testing软件测试网欢迎与业内同行进行有益的合作和交流,如果有任何有关内容方面的合作事宜,请联系我们。

相关链接:

精通软件性能测试与LoadRunner最佳实战 连载十二

posted on 2013-07-15 10:19 顺其自然EVO 阅读(590) 评论(0)  编辑  收藏 所属分类: 测试学习专栏loadrunner


只有注册用户登录后才能发表评论。


网站导航:
 
<2013年7月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

导航

统计

常用链接

留言簿(55)

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜