第一步:新建一个Application。
第二步:File----->New----->Other------>WebServices----->WSDLimporter
然后在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;
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
还有另外一种方法,即不使用HTTPRIO1
procedure TForm1.Button2Click(Sender: TObject);
var
wsobj:smarketdiscenter_smarketdiscenterPortType;
Str:string;
begin
wsobj := Getsmarketdiscenter_smarketdiscenterPortType();
Str := wsobj.getSystemTime;
ShowMessage(Str);
end;