zoukankan      html  css  js  c++  java
  • 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
    窗体文件
  • 相关阅读:
    【leetcode】1030. Matrix Cells in Distance Order
    【leetcode】1031. Maximum Sum of Two Non-Overlapping Subarrays
    【leetcode】1032. Stream of Characters
    L120 单词造句
    L119
    L118
    2018.8.6邮件规范一
    L117
    L116
    L115
  • 原文地址:https://www.cnblogs.com/rogge7/p/4414916.html
Copyright © 2011-2022 走看看