1.在delphi工程中增加一个webService引用;
(1)执行主菜单File->new->other...,选择webService页,选择WSDLImporter,OK;
(2)输入要引用的webService地址,如:http://unimap2003/regiplan_forAGS/SIPPlanApproval2009WebService_forAGS.asmx,注意:仅仅输入这个地址是不行的,会报错,需要
在地址后面加上5个字符“?wsdl”;
(3)然后next,然后Finish,就会产生一个文件,我们的例子中会产生SIPPlanApproval2009WebService_forAGS.pas文件;
2.这样的文件是不能直接使用的,需要做以下修改:
(1)在uses中增加OPConvert引用;
(2)在主函数中加入以下内容:
//add-------to support UTF-8
RIO.HTTPWebNode.UseUTF8InHeader := true; //添加该行,指定采用UTF-8代码传输
RIO.Converter.Encoding:='UTF-8';
RIO.Converter.Options:=RIO.Converter.Options + [soUTF8InHeader,soUTF8EncodeXML];
//add-------END
添加的位置是以下代码的下面:
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;
(3)在文件的末尾,也就是 initialization 的最后加入以下语句:
InvRegistry.RegisterInvokeOptions(TypeInfo(SIPPlanApproval2009WebService_forAGSSoap),ioDocument);
这样,完整的initialization 就变成
initialization
InvRegistry.RegisterInterface(TypeInfo(SIPPlanApproval2009WebService_forAGSSoap), 'http://unimap.com/', 'utf-8');
InvRegistry.RegisterDefaultSOAPAction(TypeInfo(SIPPlanApproval2009WebService_forAGSSoap), 'http://unimap.com/%operationName%');
InvRegistry.RegisterInvokeOptions(TypeInfo(SIPPlanApproval2009WebService_forAGSSoap),ioDocument);
其中SIPPlanApproval2009WebService_forAGSSoap是服务名;根据你调用的webService不同而不同;
这样自动产生的文件就修改完成了;
3.调用webService,我们以在界面上的button1的点击事件中调用webService为例
(1)在界面对应的pas文件中添加引用,就是在uses中增加SOAPHTTPClient、OPConvert和SIPPlanApproval2009WebService_forAGS,SIPPlanApproval2009WebService_forAGS就是之前自动产生
的文件;
(2)button1的click事件如是写
procedure TForm1.Button1Click(Sender: TObject);
var
mHttpRIO: THTTPRIO;
mServiceSoap: SIPPlanApproval2009WebService_forAGSSoap;
begin
mHttpRIO := THTTPRIO.Create(nil);
try
//将URL改为webService真正的地址 ,且设置Encoding、Options,否则也会乱码
mHttpRIO.URL := 'http://unimap2003/regiplan_forAGS/SIPPlanApproval2009WebService_forAGS.asmx';
mHttpRIO.HTTPWebNode.UseUTF8InHeader := true; //添加该行,指定采用UTF-8代码传输
mHttpRIO.Converter.Encoding:='UTF-8';
mHttpRIO.Converter.Options:=mHttpRIO.Converter.Options + [soUTF8InHeader,soUTF8EncodeXML];
mServiceSoap := mHttpRIO as SIPPlanApproval2009WebService_forAGSSoap;
showmessage(mServiceSoap.HollowWord) ;//调用webService中方法
except
end;
end;
4.编译,运行,成功!