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属性页上的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;//解决汉字乱码问题

//-------------以下是本人模仿的例子,窗体没有用到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

窗体文件

时间: 2024-10-17 11:14:47

Delphi7 客户端调用WebService(天气预报)的相关文章

用JDK自带的工具生成客户端调用Webservice的代码

JAVA下客户端调用Webservice代码简直是让人心生畏惧,今日尝试,做记录如下,参考网上的众多解决方案,下面这种方式是比较简单的. 在jdk的bin目录下有一个wsimport.exe的工具,使用该工具可以根据wsdl地址生成java的客户端代码. 常用命令如下: "D:\Program Files\Java\jdk1.8.0_05\bin\wsimport.exe" -keep -d d:\ -s d:\src -p com.map -verbose http://192.16

cxf客户端调用webservice报错:NoSuchMethod org.apache.commons.xml.XmlSchema.read

cxf客户端项目部署在weblogic中的时候,调用cxf webservice服务端接口时,出现如下错误: 在网上搜索过很多资料,说是jar 包版本过低,将XmlSchema-1.4.5.jar 包换成XmlSchema-2.0.1.jar 之后,还是不行. 原因是:weblogic在服务器上运行时使用的是jrokit的JDK,jrokit中已经有相关的jar包, 会优先加载jrokit/jre/lib目录下的jar包, 解决办法: 在weblogic的使用的JRockit的jre/lib目录

C#开发WEBService服务 C++开发客户端调用WEBService服务

编写程序 http://blog.csdn.net/u011835515/article/details/47615425 遇到问题及解决方法: HTTP 错误 500.19- Internal Server Error 错误解决方法 http://www.jb51.net/article/28160.htm HTTP 错误 403.14 - Forbidden Web 服务器被配置为不列出此目录的内容. 如果不希望启用目录浏览,请确保配置了默认文档并且该文件存在. 使用 IIS 管理器启用目录

jQuery调用WebService返回JSON数据

相信大家都比较了解JSON格式的数据对于ajax的方便,不了解的可以从网上找一下这方面的资料来看一下,这里就不多说了,不清楚的可以在网上查一下,这里只说一下因为参数设置不当引起的取不到返回值的问题. 在用jQuery调用WebService的时候,它contentType默认为 以下是WebService服务端的代码: 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.W

C#调用WebService服务(动态调用)

原文:C#调用WebService服务(动态调用) 1 创建WebService using System; using System.Web.Services; namespace WebService1 { /// <summary> /// Service1 的摘要说明 /// </summary> [WebService(Namespace = "http://tempuri.org/", Description="测试服务")] [

java调用webservice的四种方式

webservice: 就是应用程序之间跨语言的调用 wwww.webxml.com.cn 1.xml 2.    wsdl: webservice description language web服务描述语言 通过xml格式说明调用的地址方法如何调用,可以看错webservice的说明书 3.soap simple object access protoacl (简单对象访问协议) 限定了xml的格式 soap 在http(因为有请求体,所以必须是post请求)的基础上传输xml数据 请求和响

多么痛的领悟---andorid调用webservice

回头想想,上班之后就很少来写博客了,刚开始是忙,忙得睡觉都想着bug,到后来是堕落了,人一堕落很容易就会麻痹掉.过了个年,又长大了一岁,2015也得有个规划,好好收获点东西. 这几天上班接触了一些之前没怎么接触过的东西,在android客户端调用webservice接口进行数据的上传和下载.其实半年前自己就有着手过去学一下网络编程,但都是粗略地看了一下电子书,并没有真正折腾过这块,搞得现在真正用起来很吃力...现在总结下这几天痛的领悟: 问题一:刚开始接触到这份文档,下意识用传统的传参方法向服务

webService总结(四)——使用axis2发布和调用webService

准备工作 Axis2 官网 http://axis.apache.org/  下载axis2相关资料 其中 axis2-1.6.2-bin.zip文件中包含了Axis2中所有的jar文件, axis2-1.6.2-war.zip文件用于将WebService发布到Web容器中.最后两个是axis2在eclipse中的插件. 大概说说这几个文件如何使用. 1.解压axis2-1.6.2-bin.zip到任意目录.然后在eclipse中按下图配置. 2.将axis2-1.6.2-war.zip文件解

spring boot整合cxf发布和调用webservice

一.前言 说起web service最近几年restful大行其道,大有取代传统soap web service的趋势,但是一些特有或相对老旧的系统依然使用了传统的soap web service,例如银行.航空公司的机票查询接口等.本博客主要讲解得是spring boot整合cxf发布webservice服务和spring boot整合cxf客户端调用webservice服务本案例使用maven方式二.编码核心文件清单1.pom.xml <?xml version="1.0"