[原创] 分布式系统框架搭建 PartThree-Delphi 露脸

本文介绍如何使用Delphi调用.NET WebService,并详细解释了配置步骤与代码实现细节,包括客户端数据集的设置及XML数据的解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们的WebService 做成了,调用也成功了 .net 调用 .net 的东西很容易,但是我个人很不喜欢微软。写WebService 有很多可以实现 java delphi  ruby 等..客户端也是。根据实际情况,选择即可!但是在桌面客户端的话,我比较偏向与Delphi.桌面客户端谁也不愿意背着个.net freamwork 到处跑!接下来玩点有意思的,使用.net 的Web Service 并用Delphi 来实现Web Service 的调用!现在我想使用 Delphi 来调用WebService 又该如何了? Delphi 调用WEbService 的方法倒是简单,但是用delphi 调用 .net 返回的数据集又如何? 随我来,我来揭开谜底。

开启Delphi 新建一个VCL application,再添加一个WSDL importer



填写如 URL
还是和刚才 wsdl.exe 哪里的 URL 一样!!
http://localhost:2387/WebService/Service.asmx?wsdl
点击 Finish 生成 webservice 接口


finish 结束


在窗体上添加 如下控件TclientDataSet、THTTPRIO 、TXMLTransformProvider
TdataSource 、TDBGrid

设置属性

DBGrid1
DataSource 指向DataSource1

DataSource1
DataSet 指向ClientDataSet1

ClientDataSet1
providername 指向XMLTransformProvider1

HTTPRIO1
Port 设置  ServiceSoap
Service 设置Service
WSDLLOcation 设置 http://localhost:2387/WebService/Service.asmx?wsdl

代码为
uses Service; //使用刚才生成的接口
procedure TForm1.BitBtn1Click(Sender: TObject);
var
IntRes:Integer;
StrRes:String;
begin
   (HTTPRIO1 as ServiceSoap).GetDataSet('Select * From Customers')
{
//注释了,几个webService 的测试函数
IntRes:=(HTTPRIO1 as ServiceSoap).Add(1,2);
StrRes:=(HTTPRIO1 as ServiceSoap).HelloWorld('Cool');
SHowMessage(IntToStr(IntRes));
ShowMessage(StrRes);
}
end;

procedure TForm1.HTTPRIO1AfterExecute(const MethodName: string;
  SOAPResponse: TStream);
  var
   XMLDoc: IXMLDocument;

begin
SOAPResponse.Position := 0;
//读入soap 到memo1中
  Memo1.Lines.LoadFromStream(SOAPResponse);
  SOAPResponse.Position := 0;

end;
运行一下,获取解析出来XML数据




把Memo1 内容复制出来保存为XML 文件,这里保存为RawData.xml 文件,OK 使用Delphi 的XML Mapper 映射XML


选择好列以后,选择 File -> Save ->Transformation, 保存为 ToDp.xtr
注意这里有个bug还是什么 Delphi 不知道SOAP 的名称空间 所以预览数据还是空的!我们一下手工修复一下,
我用的是Delphi 10 不知道Delphi 2009 如何?使用记事本打开刚才生成的ToDp.xtr 文件第一行位置
<SelectEach dest="DATAPACKET/ROWDATA/ROW" from="/soap:Envelope/soap:Body/....">
   [修改为]
<SelectEach dest="DATAPACKET/ROWDATA/ROW" from="/Envelope/soap:Body/....">
OK!
接下来,回到 Delphi 里面修改TXMLTransformProvider 属性
TransformRead.TransformationFile 为刚才的 xtr 文件这里我的是
D:/My Documents/Borland Studio Projects/ToDp.xtr
现在还要修改代码,直接从解析的 XML 转成 DataSet 格式只用修正HTTPRIO1AfterExecute 事件为
procedure TForm1.HTTPRIO1AfterExecute(const MethodName: string;
  SOAPResponse: TStream);
  var
   XMLDoc: IXMLDocument;
begin
  SOAPResponse.Position := 0;
  Memo1.Lines.LoadFromStream(SOAPResponse);
  ClientDataset1.Active := FALSE;
  SOAPResponse.Position := 0;
  XMLDoc := NewXMLDocument;
  XMLDoc.Encoding := 'GB2312';
  SOAPResponse.Position := 0;
  XMLDoc.LoadFromStream(SOAPResponse);
  XMLTransformProvider1.TransformRead.SourceXmlDocument := XMLDoc.GetDOMDocument;
  ClientDataset1.Active := TRUE;
end;
注意单元的引用读 XML 需要 uses XMLIntf,XMLDoc; F9 运行一下!
呵呵 ~ 成功!

运行速度不错!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值