您的位置:首页 > 编程语言 > Delphi

Delphi 客户端调用WebService(天气预报)

2013-09-30 14:02 295 查看
客户程序:

第一步:新建一个Application。
第二步:File----->New----->Other------>WebServices----->Soap Services Importer

然后在Wsdl or Xml Schema Location中填入:http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl,然后确定即生成了一个新的接口定义单元。

第二步:在主form上放上一个按钮和一个Httprio组件(在WebServices页上),并引用第二个单元(即通过Soap Services Importer自动生成的单元)

在Httprio的属性页上的WsdlLocation里面填上http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl;然后在Httprio属性页上的Port和Service上选择上相应的数据即可。

第三步:书写客户调用程序,原代码如下:

procedure TForm1.Button1Click(Sender: TObject);

var

i: Integer;

TMP_Weather: ArrayOfString;

begin

//http://developer.51cto.com/art/200908/147125.htm

//http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl

TMP_Weather := (HTTPRIO1 as WeatherWebServiceSoap).getWeatherbyCityName('53698'); //石家庄

Memo1.Lines.Clear;

for i := 0 to 22 do

begin

Memo1.Lines.Add(TMP_Weather[i]);

end;

end;

---- 错误信息为:

Project Project1.exe raised exception class ERemotableException with message '服务器无法处理请求。 ---> 未将对象引用设置到对象的实例。'. Process stopped. Use Step or Run to continue.

------解决方案--------------------------------------------------------

修改一下WeatherWebService.pas这个单元,如下所示,一切就OK啦。

Delphi(Pascal) code
if HTTPRIO = nil then
RIO := THTTPRIO.Create(nil)
else
RIO := HTTPRIO;
RIO.HTTPWebNode.UseUTF8InHeader:= True;  //这里加上这一句
try
Result := (RIO as TestStationSoap);
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;

InvRegistry.RegisterInterface(TypeInfo(WeatherWebServiceSoap), 'http://WebXml.com.cn/', 'utf-8');
InvRegistry.RegisterDefaultSOAPAction(TypeInfo(WeatherWebServiceSoap), 'http://WebXml.com.cn/%operationName%');
RemClassRegistry.RegisterXSInfo(TypeInfo(ArrayOfString), 'http://WebXml.com.cn/', 'ArrayOfString');
RemClassRegistry.RegisterXSClass(getSupportDataSetResult, 'http://WebXml.com.cn/', 'getSupportDataSetResult');
InvRegistry.RegisterInvokeOptions(TypeInfo(WeatherWebServiceSoap), ioDocument);//这里加上这一句

------解决方案--------------------------------------------------------
补充一下,如果你用到HTTPRIO1去调webservice接口
那就记得在前面加上这句
HTTPRIO1.HTTPWebNode.UseUTF8InHeader:= True;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: