晶
晶晶
Unregistered / Unconfirmed
GUEST, unregistred user!
现在网络上最时髦的词是什么?“.NET”还有就是它所倡导的“Web Services”吧!^_^
很多书上都介绍这个服务的概念,简单的说就是将现在的http服务提升一个层次,提供各种跨平台和跨语言
的服务,你不要关心给你服务的服务器是MS系统还是Unix系统,更不要去关心提供服务的程序是用什么语言
来编写的。它们都是依靠SOAP(简单对象访问协议,现在很流行的一个协议)-一个以XML和HTTP为基础的简
单协议来通信的!但我们怎么知道别人提供的服务要哪些参数和怎么样的参数呢?这就要依靠SOAP中提出的
WSDL(网络服务定义语言)脚本了。好了简单将这么多吧!下面我们来做一个发送邮件的客户程序吧!
我们平时发送邮件的程序都是使用INDY的idsmtp和idmessage组件配合编写,现在我们利用网络上别人做好的
服务来编写一个非常简单的利用WebServices的程序!(WebServices提倡的就是网络服务的共享)
第一步:我们要查找我们需要的服务究竟谁可以提供!现在提供网络上WebServices服务的不算多,但以后就
会多了(毕竟WebServices发展没有多久),就象现在的HTTP服务一样!
第二步:得到服务提供者的WSDL,这是我们要求服务的方法和参数调用的封装格式说明。(有点象SDK中的函数
申明,不过它是基于网络的,远程调用)
第三步:将WSDL转化为你所使用开发语言的对应单元,这样才好在你的开发语言中使用。这里我们使用delphi7.0
,里面有一个专门的工具(WSDL Importer)来智能完成转换,我们基本上不要做什么^_^
第四步:在自己的程序中使用由WSDL映射到我们使用语言的接口来完成整个工作。经过简单的四步,我们完成了
一个真正意义上的WebServices客户端程序。
下面分布介绍:
第一步:我们要使用的是发送e-mail的服务,到网上你可以找到很多,我这里使用的是由
http://www.abysal.com/soap/soapmaildemo.html提供的;
第二步:找到它的开发接口WSDL:http://www.abysal.com/soap/AbysalEmail.wsdl
第三步:打开自己的Delphi7.0添加一个窗体和6个labeledEdit一个按钮和一个memo就可以了。然后打开
file-new-other-webservices-wdsl importer在URL中填入刚才找到的WSDL网络地址,然后单击NEXT就可以生成
我们使用的接口单元了!
第四步:在主窗体中再添加一个THTTPRIO组件(它来完成发送数据的包装),并且为它的WSDLLocation属性配上
我们使用的WSDL的URL就可以使用了!下面是所有的源码:
-----主窗体代码-----
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, InvokeRegistry, Rio, SOAPHTTPClient,smtpserver{WSDL映射的单元},
StdCtrls,Types{SOAP常用结构的申明},
ExtCtrls;
type
TForm1 = class(TForm)
HTTPRIO1: THTTPRIO;
LabeledEdit1: TLabeledEdit;
LabeledEdit3: TLabeledEdit;
LabeledEdit4: TLabeledEdit;
LabeledEdit5: TLabeledEdit;
Memo1: TMemo;
Label1: TLabel;
Button1: TButton;
LabeledEdit6: TLabeledEdit;
LabeledEdit7: TLabeledEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
services:SendEmailPortType;
begin
services:=HTTPRIO1 as SendEmailPortType;
services.SendEmail(LabeledEdit3.Text,LabeledEdit6.Text,
LabeledEdit7.Text,LabeledEdit4.Text,LabeledEdit5.Text,
memo1.Lines.Text,'','');
end;
end.
-----WSDL映射的单元-----
unit smtpserver;
interface
uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;
type
SendEmailPortType = interface(IInvokable)
['{704E446C-ACD4-AFAE-FA0A-385FA6001580}']
function SendEmail(const From: WideString;
const FromAddress: WideString;
const To_: WideString;
const ToAddress: WideString;
const Subject: WideString;
const MsgBody: WideString;
const Acknowledgement: WideString;
const Priority:
WideString): integer;
stdcall;
end;
function GetSendEmailPortType(UseWSDL: Boolean=System.False;
Addr: string='';
HTTPRIO: THTTPRIO = nil): SendEmailPortType;
implementation
function GetSendEmailPortType(UseWSDL: Boolean;
Addr: string;
HTTPRIO: THTTPRIO): SendEmailPortType;
const
defWSDL = 'http://www.abysal.com/soap/AbysalEmail.wsdl';
defURL = 'http://www.abysal.com/soap/abysal_webdtp';
defSvc = 'SendEmailService';
defPrt = 'SendEmailPort';
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 SendEmailPortType);
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(SendEmailPortType), 'http://www.abysal.com/Abysal-webDTP', 'UTF-8');
InvRegistry.RegisterDefaultSOAPAction(TypeInfo(SendEmailPortType), 'http://www.abysal.com/soap#abysal_program=soapmail');
InvRegistry.RegisterExternalParamName(TypeInfo(SendEmailPortType), 'SendEmail', 'To_', 'To');
end.
以上单元是由WSDL Importer自动生成的,我们只要注意其中的接口中的方法就可以了。Web Services倡导的简单使用的确真实有效,我只是
知道方法接口,其他的我们一无所知,但是通过SOAP我们一样可以使用这些服务!
好了,编译后试试。我这里发送成功,不知道你做的发送成功了么?
开发环境:WindowsXP+Delphi7.0
以上是学习SOAP的一个例子,很简单,希望给初学者一个抛砖引玉的作用!
很多书上都介绍这个服务的概念,简单的说就是将现在的http服务提升一个层次,提供各种跨平台和跨语言
的服务,你不要关心给你服务的服务器是MS系统还是Unix系统,更不要去关心提供服务的程序是用什么语言
来编写的。它们都是依靠SOAP(简单对象访问协议,现在很流行的一个协议)-一个以XML和HTTP为基础的简
单协议来通信的!但我们怎么知道别人提供的服务要哪些参数和怎么样的参数呢?这就要依靠SOAP中提出的
WSDL(网络服务定义语言)脚本了。好了简单将这么多吧!下面我们来做一个发送邮件的客户程序吧!
我们平时发送邮件的程序都是使用INDY的idsmtp和idmessage组件配合编写,现在我们利用网络上别人做好的
服务来编写一个非常简单的利用WebServices的程序!(WebServices提倡的就是网络服务的共享)
第一步:我们要查找我们需要的服务究竟谁可以提供!现在提供网络上WebServices服务的不算多,但以后就
会多了(毕竟WebServices发展没有多久),就象现在的HTTP服务一样!
第二步:得到服务提供者的WSDL,这是我们要求服务的方法和参数调用的封装格式说明。(有点象SDK中的函数
申明,不过它是基于网络的,远程调用)
第三步:将WSDL转化为你所使用开发语言的对应单元,这样才好在你的开发语言中使用。这里我们使用delphi7.0
,里面有一个专门的工具(WSDL Importer)来智能完成转换,我们基本上不要做什么^_^
第四步:在自己的程序中使用由WSDL映射到我们使用语言的接口来完成整个工作。经过简单的四步,我们完成了
一个真正意义上的WebServices客户端程序。
下面分布介绍:
第一步:我们要使用的是发送e-mail的服务,到网上你可以找到很多,我这里使用的是由
http://www.abysal.com/soap/soapmaildemo.html提供的;
第二步:找到它的开发接口WSDL:http://www.abysal.com/soap/AbysalEmail.wsdl
第三步:打开自己的Delphi7.0添加一个窗体和6个labeledEdit一个按钮和一个memo就可以了。然后打开
file-new-other-webservices-wdsl importer在URL中填入刚才找到的WSDL网络地址,然后单击NEXT就可以生成
我们使用的接口单元了!
第四步:在主窗体中再添加一个THTTPRIO组件(它来完成发送数据的包装),并且为它的WSDLLocation属性配上
我们使用的WSDL的URL就可以使用了!下面是所有的源码:
-----主窗体代码-----
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, InvokeRegistry, Rio, SOAPHTTPClient,smtpserver{WSDL映射的单元},
StdCtrls,Types{SOAP常用结构的申明},
ExtCtrls;
type
TForm1 = class(TForm)
HTTPRIO1: THTTPRIO;
LabeledEdit1: TLabeledEdit;
LabeledEdit3: TLabeledEdit;
LabeledEdit4: TLabeledEdit;
LabeledEdit5: TLabeledEdit;
Memo1: TMemo;
Label1: TLabel;
Button1: TButton;
LabeledEdit6: TLabeledEdit;
LabeledEdit7: TLabeledEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
services:SendEmailPortType;
begin
services:=HTTPRIO1 as SendEmailPortType;
services.SendEmail(LabeledEdit3.Text,LabeledEdit6.Text,
LabeledEdit7.Text,LabeledEdit4.Text,LabeledEdit5.Text,
memo1.Lines.Text,'','');
end;
end.
-----WSDL映射的单元-----
unit smtpserver;
interface
uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;
type
SendEmailPortType = interface(IInvokable)
['{704E446C-ACD4-AFAE-FA0A-385FA6001580}']
function SendEmail(const From: WideString;
const FromAddress: WideString;
const To_: WideString;
const ToAddress: WideString;
const Subject: WideString;
const MsgBody: WideString;
const Acknowledgement: WideString;
const Priority:
WideString): integer;
stdcall;
end;
function GetSendEmailPortType(UseWSDL: Boolean=System.False;
Addr: string='';
HTTPRIO: THTTPRIO = nil): SendEmailPortType;
implementation
function GetSendEmailPortType(UseWSDL: Boolean;
Addr: string;
HTTPRIO: THTTPRIO): SendEmailPortType;
const
defWSDL = 'http://www.abysal.com/soap/AbysalEmail.wsdl';
defURL = 'http://www.abysal.com/soap/abysal_webdtp';
defSvc = 'SendEmailService';
defPrt = 'SendEmailPort';
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 SendEmailPortType);
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(SendEmailPortType), 'http://www.abysal.com/Abysal-webDTP', 'UTF-8');
InvRegistry.RegisterDefaultSOAPAction(TypeInfo(SendEmailPortType), 'http://www.abysal.com/soap#abysal_program=soapmail');
InvRegistry.RegisterExternalParamName(TypeInfo(SendEmailPortType), 'SendEmail', 'To_', 'To');
end.
以上单元是由WSDL Importer自动生成的,我们只要注意其中的接口中的方法就可以了。Web Services倡导的简单使用的确真实有效,我只是
知道方法接口,其他的我们一无所知,但是通过SOAP我们一样可以使用这些服务!
好了,编译后试试。我这里发送成功,不知道你做的发送成功了么?
开发环境:WindowsXP+Delphi7.0
以上是学习SOAP的一个例子,很简单,希望给初学者一个抛砖引玉的作用!