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

客户程序:
第一步:新建一个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属性页上的PortService上选择上相应的数据即可。

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

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.
自动生成的WebService文件
 1 unit Unit1;
 2 
 3 interface
 4 
 5 uses
 6   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 7   Dialogs, StdCtrls, ExtCtrls;//, InvokeRegistry, Rio, SOAPHTTPClient;
 8 
 9 type
10   TForm1 = class(TForm)
11     mmo1: TMemo;
12     pnl1: TPanel;
13     btn1: TButton;
14     procedure btn1Click(Sender: TObject);
15   private
16     { Private declarations }
17   public
18     { Public declarations }
19   end;
20 
21 var
22   Form1: TForm1;
23 
24 implementation
25 
26 {$R *.dfm}
27  //网页例子 http://blog.csdn.net/gjtao1130/article/details/12193235
28 uses WeatherWebService;
29 
30 procedure TForm1.btn1Click(Sender: TObject);
31 var
32   i: Integer;
33   TMP_Weather: ArrayOfString;
34 begin
35   //http://developer.51cto.com/art/200908/147125.htm
36   //http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl
37   {TMP_Weather := (htpr1 as WeatherWebServiceSoap).getSupportCity('广西');//玉林 (59453)
38   mmo1.Lines.Clear;
39   for i := 0 to 10 do
40   begin
41     mmo1.Lines.Add(TMP_Weather[i]);
42   end;  }
43   //TMP_Weather := (htpr1 as WeatherWebServiceSoap).getWeatherbyCityName('59453'); //深圳
44   TMP_Weather := GetWeatherWebServiceSoap(False,'',nil).getWeatherbyCityName('59453');
45   //GetWeatherWebServiceSoap(Self).getWeatherbyCityName('59453');                                                                       //玉林 (59453)
46   mmo1.Lines.Clear;
47   for i := 0 to 22 do
48   begin
49     mmo1.Lines.Add(TMP_Weather[i]);
50   end;
51 end;
52 
53 end.
窗体单元文件
 1 object Form1: TForm1
 2   Left = 295
 3   Top = 167
 4   Width = 592
 5   Height = 427
 6   Caption = '天气预报WebService'
 7   Color = clBtnFace
 8   Font.Charset = DEFAULT_CHARSET
 9   Font.Color = clWindowText
10   Font.Height = -11
11   Font.Name = 'MS Sans Serif'
12   Font.Style = []
13   OldCreateOrder = False
14   PixelsPerInch = 96
15   TextHeight = 13
16   object mmo1: TMemo
17     Left = 0
18     Top = 41
19     Width = 576
20     Height = 348
21     Align = alClient
22     Color = clMoneyGreen
23     ImeName = '中文 (简体) - 搜狗拼音输入法'
24     ScrollBars = ssVertical
25     TabOrder = 0
26   end
27   object pnl1: TPanel
28     Left = 0
29     Top = 0
30     Width = 576
31     Height = 41
32     Align = alTop
33     Color = clGradientActiveCaption
34     TabOrder = 1
35     object btn1: TButton
36       Left = 40
37       Top = 8
38       Width = 106
39       Height = 25
40       Caption = '测试天气信息'
41       TabOrder = 0
42       OnClick = btn1Click
43     end
44   end
45 end
窗体文件

 

posted @ 2015-04-10 16:02  海蓝7  阅读(1898)  评论(0编辑  收藏  举报