客户程序:
第一步:新建一个Application。
第二步:File----->New----->Other------>WebServices----->WSDL Importer
然后在Location of WSDL File or URL中填入:
http://10.22.30.61:36601/MonitorService.asmx?wsdl
或 http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl,然后确定即生成了一个新的接口定义单元。
第二步:在主form上放上一个按钮和一个Httprio组件(在WebServices页上),并引用第二个单元(即通过WSDL 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;//解决汉字乱码问题
本文出自:http://blog.csdn.net/gjtao1130/article/details/12193235 只是做部分修正。
//-------------以下是本人模仿的例子,窗体没有用到Httprio组件,通过GetWeatherWebServiceSoap函数处理即可。
1 // ************************************************************************ // 2 // The types declared in this file were generated from data read from the 3 // WSDL File described below: 4 // WSDL : http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl 5 // Encoding : utf-8 6 // Version : 1.0 7 // (2014/12/10 11:28:28 - 1.33.2.5) 8 // ************************************************************************ // 9 10 unit WeatherWebService; 11 12 interface 13 14 uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns; 15 16 type 17 18 // ************************************************************************ // 19 // The following types, referred to in the WSDL document are not being represented 20 // in this file. They are either aliases[@] of other types represented or were referred 21 // to but never[!] declared in the document. The types from the latter category 22 // typically map to predefined/known XML or Borland types; however, they could also 23 // indicate incorrect WSDL documents that failed to declare or import a schema type. 24 // ************************************************************************ // 25 // !:string - "http://www.w3.org/2001/XMLSchema" 26 27 getSupportDataSetResult = class; { "http://WebXml.com.cn/" } 28 29 ArrayOfString = array of WideString; { "http://WebXml.com.cn/" } 30 31 32 // ************************************************************************ // 33 // Namespace : http://WebXml.com.cn/ 34 // ************************************************************************ // 35 getSupportDataSetResult = class(TRemotable) 36 private 37 Fschema: WideString; 38 published 39 property schema: WideString read Fschema write Fschema; 40 end; 41 42 43 // ************************************************************************ // 44 // Namespace : http://WebXml.com.cn/ 45 // soapAction: http://WebXml.com.cn/%operationName% 46 // transport : http://schemas.xmlsoap.org/soap/http 47 // binding : WeatherWebServiceSoap 48 // service : WeatherWebService 49 // port : WeatherWebServiceSoap 50 // URL : http://www.webxml.com.cn/WebServices/WeatherWebService.asmx 51 // ************************************************************************ // 52 WeatherWebServiceSoap = interface(IInvokable) 53 ['{0AF62441-3FA0-F5D8-B6B8-B486F32F9DDE}'] 54 function getSupportCity(const byProvinceName: WideString): ArrayOfString; stdcall; 55 function getSupportProvince: ArrayOfString; stdcall; 56 function getSupportDataSet: getSupportDataSetResult; stdcall; 57 function getWeatherbyCityName(const theCityName: WideString): ArrayOfString; stdcall; 58 function getWeatherbyCityNamePro(const theCityName: WideString; const theUserID: WideString): ArrayOfString; stdcall; 59 end; 60 61 function GetWeatherWebServiceSoap(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): WeatherWebServiceSoap; 62 63 64 implementation 65 66 function GetWeatherWebServiceSoap(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): WeatherWebServiceSoap; 67 const 68 defWSDL = 'http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl'; 69 defURL = 'http://www.webxml.com.cn/WebServices/WeatherWebService.asmx'; 70 defSvc = 'WeatherWebService'; 71 defPrt = 'WeatherWebServiceSoap'; 72 var 73 RIO: THTTPRIO; 74 begin 75 Result := nil; 76 if (Addr = '') then 77 begin 78 if UseWSDL then 79 Addr := defWSDL 80 else 81 Addr := defURL; 82 end; 83 if HTTPRIO = nil then 84 RIO := THTTPRIO.Create(nil) 85 else 86 RIO := HTTPRIO; 87 RIO.HTTPWebNode.UseUTF8InHeader:= True; //这里加上这一句 88 try 89 Result := (RIO as WeatherWebServiceSoap); 90 if UseWSDL then 91 begin 92 RIO.WSDLLocation := Addr; 93 RIO.Service := defSvc; 94 RIO.Port := defPrt; 95 end else 96 RIO.URL := Addr; 97 finally 98 if (Result = nil) and (HTTPRIO = nil) then 99 RIO.Free; 100 end; 101 end; 102 103 104 initialization 105 InvRegistry.RegisterInterface(TypeInfo(WeatherWebServiceSoap), 'http://WebXml.com.cn/', 'utf-8'); 106 InvRegistry.RegisterDefaultSOAPAction(TypeInfo(WeatherWebServiceSoap), 'http://WebXml.com.cn/%operationName%'); 107 RemClassRegistry.RegisterXSInfo(TypeInfo(ArrayOfString), 'http://WebXml.com.cn/', 'ArrayOfString'); 108 RemClassRegistry.RegisterXSClass(getSupportDataSetResult, 'http://WebXml.com.cn/', 'getSupportDataSetResult'); 109 InvRegistry.RegisterInvokeOptions(TypeInfo(WeatherWebServiceSoap), ioDocument);//这里加上这一句 110 111 end.