绪论

本文介绍使用VC++编程实现访问天气Web服务的简单实例(例子来源于网络)。

Web天气服务

http://www.webxml.com.cn/WebServices/WeatherWebService.asmx

天气预报 Web 服务,数据每2.5小时左右自动更新一次,准确可靠。包括 340 多个中国主要城市和 60 多个国外主要城市三日内的天气预报数据。

查询本天气预报Web Services支持的国内外城市或地区信息

输入参数:byProvinceName = 指定的洲或国内的省份,若为ALL或空则表示返回全部城市;返回数据:一个一维字符串数组 String(),结构为:城市名称(城市代码)。

获得本天气预报Web Services支持的洲、国内外省份和城市信息

输入参数:无;返回:DataSet 。DataSet.Tables(0) 为支持的洲和国内省份数据,DataSet.Tables(1) 为支持的国内外城市或地区数据。DataSet.Tables(0).Rows(i).Item("ID") 主键对应 DataSet.Tables(1).Rows(i).Item("ZoneID") 外键。
Tables(0):ID = ID主键,Zone = 支持的洲、省份;Tables(1):ID 主键,ZoneID = 对应Tables(0)ID的外键,Area = 城市或地区,AreaCode = 城市或地区代码。

获得本天气预报Web
Services支持的洲、国内外省份和城市信息

输入参数:无; 返回数据:一个一维字符串数组 String(),内容为洲或国内省份的名称。

根据城市或地区名称查询获得未来三天内天气情况、现在的天气实况、天气和生活指数

调用方法如下:输入参数:theCityName = 城市中文名称(国外城市可用英文)或城市代码(不输入默认为上海市),如:上海 或 58367,如有城市名称重复请使用城市代码查询(可通过 getSupportCity 或 getSupportDataSet 获得);返回数据: 一个一维数组 String(22),共有23个元素。
String(0) 到 String(4):省份,城市,城市代码,城市图片名称,最后更新时间。String(5) 到 String(11):当天的 气温,概况,风向和风力,天气趋势开始图片名称(以下称:图标一),天气趋势结束图片名称(以下称:图标二),现在的天气实况,天气和生活指数。String(12) 到 String(16):第二天的 气温,概况,风向和风力,图标一,图标二。String(17) 到 String(21):第三天的 气温,概况,风向和风力,图标一,图标二。String(22) 被查询的城市或地区的介绍
下载天气图标(包含大、中、小尺寸) 天气图例说明 调用此天气预报Web
Services实例下载
(VB ASP.net 2.0)

根据城市或地区名称查询获得未来三天内天气情况、现在的天气实况、天气和生活指数(For商业用户)

调用方法同
getWeatherbyCityName,输入参数:theUserID = 商业用户ID

Microsoft SOAP Toolkit
3.0

SOAP(简单对象访问协议)是交换数据的一种协议规范,是一种轻量的、简单的、基于XML(标准通用标记语言下的一个子集)的协议,它被设计成在WEB上交换结构化的和固化的信息。

微软提供了SOAP协议的SDK,SOAP
Toolkit3.0是基于COM的一套SOAP开发组件。  Microsoft SOAP Toolkit 3.0 提供一个灵活的框架,可以为各种
Intranet 和
Internet 解决方案构建可伸缩的
Web 服务。

下载安装:https://www.neowin.net/news/microsoft-soap-toolkit-30

VC++ 访问WeatherWebService

  基本步骤:

  1.导入类型库

  2.需要创建一个SoapConnector

  3.下一步创建SoapSerializer

  4.下一步把消息附加到SoapConnector的输入流

  5.下一步读取结果.要读取服务器的回复,客户端应用需要使用SoapReader,

  6.SoapReader被连接到SoapConnector输出流

  7.用IXMLDOMElement对象可以从SoapReader里读到服务器的回复

附录:

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
 
#include "WeatherWS.h "

int main(void)
{
    CWeatherWS weather;
    weather.ConnectInternet();
    cout << "请输入城市名(例如-北京):";
    string strCityName;
    cin >> strCityName;
    if (!strCityName.empty())
    {
        weather.TransMessage(strCityName.c_str());
    }
    else
    {
        cout << "输入的城市名为空!" << endl;
    }

string wea[];
    weather.getMessage(wea);
    ; i++)
    {
        cout << wea[i] << endl;
    }

cin.get();
    ;
}

// WeatherWS.h : interface for the CWeatherWS class.

//

//////////////////////////////////////////////////////////////////////

#if !defined(AFX_WEATHERWS_H__B1272FDC_06B4_4C5C_8B33_9D4A35AF336C__INCLUDED_)
#define AFX_WEATHERWS_H__B1272FDC_06B4_4C5C_8B33_9D4A35AF336C__INCLUDED_

#pragma once
#endif // _MSC_VER > 1000

#include <stdio.h>

#import "msxml3.dll"                    //SOAP使用XML作为其数据格式,因此我们还需要微软的XML Parser来处理XML内容,它包含在msxml3.dll中。
//using namespace MSXML2;              //使用MSXML2的命名空间
#import "C:\\Program Files (x86)\\Common Files\\MSSoap\\Binaries\\MSSOAP30.dll" exclude("IStream", "IErrorInfo", "ISequentialStream", "_LARGE_INTEGER", "_ULARGE_INTEGER", "tagSTATSTG", "_FILETIME")         //导入mssoap30.dll
using namespace MSSOAPLib30;                         //使用MSSOAPLib30的命名空间,需要安装SOAP Toolkit3.0

#include <string>
#include "windows.h"
#include <iostream>
using namespace std;

class CWeatherWS
{
public:
    void ConnectInternet();                   //连接网络
    void TransMessage(const char *city);      //向网络发送相应请求
    void getMessage(string *weather);         //得到需要的信息

CWeatherWS();
    virtual ~CWeatherWS();

private:
    ISoapSerializerPtr Serializer;            //Serialize指针用于发送SOAP消息
    ISoapReaderPtr Reader;                    //定义读取指针
    ISoapConnectorPtr Connector;              //定义连接指针

bool ConnectSuccess;
};

#endif // !defined(AFX_WEATHERWS_H__B1272FDC_06B4_4C5C_8B33_9D4A35AF336C__INCLUDED_)

// WeatherWS.cpp: implementation of the ButterflyWEB class.

//

//////////////////////////////////////////////////////////////////////
#include "WeatherWS.h "
//////////////////////////////////////////////////////////////////////

// Construction/Destruction

//////////////////////////////////////////////////////////////////////

CWeatherWS::CWeatherWS()
{
    CoInitialize(NULL);             //COM初始化
}

CWeatherWS::~CWeatherWS()
{
    CoUninitialize();
}

void CWeatherWS::ConnectInternet()
{
    //创建连接实例
    HRESULT hr = Connector.CreateInstance(__uuidof(HttpConnector30));
    if(FAILED(hr))
    {
        cout << "CreateInstance ERROR!" << endl;
        return;
    }

//连接属性得到将要进行连接的URL
    Connector->Property["EndPointURL"] = "http://www.webxml.com.cn/WebServices/WeatherWebService.asmx";

//和服务器连接
    hr = Connector->Connect();

// Begin message
    //  Connector->Property["SoapAction"] = _bstr_t(NameSpace)+"/"+_bstr_t(method);
    Connector->Property["SoapAction"] = "http://WebXml.com.cn/getWeatherbyCityName";  //将要进行的操作
    Connector->BeginMessage(); //开始准备发送消息
}

void CWeatherWS::TransMessage(const char *city)
{
    HRESULT hr = Serializer.CreateInstance(__uuidof(SoapSerializer30));//创建一个Serializer实例
    if(!SUCCEEDED(hr))
    {
        //  MessageBox("无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库!");
        cout << "ERROR";
        return ;
    }

// 将serializer连接到connector的输入字符串
    Serializer->Init(_variant_t((IUnknown *)Connector->InputStream));

// 创建SOAP消息
    Serializer->StartEnvelope("soap", "", "");
    Serializer->StartBody("body");
    Serializer->StartElement("getWeatherbyCityName", "http://WebXml.com.cn/", "", ""); // 方法+命名空间
    Serializer->StartElement("theCityName", "http://WebXml.com.cn/", "", "");
    Serializer->WriteString(city); //传入城市的名字
    Serializer->EndElement();
    Serializer->EndElement();
    Serializer->EndBody();
    Serializer->EndEnvelope();

try
    {
        // Send the message to the web service
        Connector->EndMessage(); //向网站发送消息
        ConnectSuccess = true;
    }
    catch(_com_error e)
    {
        MessageBox(, NULL);
        MessageBox(NULL, "请检查网络连接!", "Butterfly Warning", NULL);
        ConnectSuccess = false;
        return;
    }
}

void CWeatherWS::getMessage(string *weather)
{
    if (ConnectSuccess)
    {
        // 读取响应
        HRESULT hr = Reader.CreateInstance(__uuidof(SoapReader30));
        if(!SUCCEEDED(hr))
        {
            //  MessageBox("无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库!");
            cout << "ERROR";
            return ;
        }
        // 将reader联接到connector的输出字符串
        Reader->Load(_variant_t((IUnknown *)Connector->OutputStream), "");

string item[] = {"省份", "城市", "发布时间", "温度", "天气", "风向", "备注"};
        string str;

//printf("Answer: %s\n",  (const char*)Reader->RpcResult->text);
        printf("Answer: %s\n", (const char *)Reader->Body->xml);
        string strstr = Reader->Body->xml;
        printf("\n");

MSXML2::IXMLDOMNodePtr DOMptr = Reader->RpcResult->firstChild;
        ; i++)
        {
            str = (const char *)DOMptr->firstChild->text;
            if (str == "查询结果为空!")
            {
                weather[] = "对不起" + str;
                weather[] = "请检查输入的信息是否正确!";
                return;
            }

)
            {
                //cout<<item[j]<<":"<<str<<endl;
                weather[j] = item[k] + ":" + str;
                j++;
                k++;
            }

DOMptr = DOMptr->nextSibling;//链表指针后移
        }//输出信息
        //     CoUninitialize();

}
}

VC++ 使用MSSOAP访问WebService天气服务(客户端开发)的更多相关文章

  1. 客户端访问WebService和PageMethod

    客户端访问WebService 客户端访问WebService和后台访问WebService没什么不同,注意的地方是要在ScriptManager中添加 <Services>        ...

  2. C++客户端访问WebService VS2008

    VS2008及之后的版本已经不支持使用C++开发WEBService服务了,如果要在VS上开发WEBService,需要使用C#开发语言. 一.gSOAP简介 gSOAP编译工具提供了一个基于SOAP ...

  3. 问题-XE8客户端访问Webservice时报“no selected dom vendor”

    问题现象:XE8做的客户端访问XE8做的Webservice时,客户端报“no selected dom vendor”. 问题原因:原因不明,应该是用到了XML转换等方法吧.有高手了解的,请M我. ...

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

    编写WEBService服务端应用程序并部署 http://blog.csdn.net/u011835515/article/details/47615425 编写调用WEBService的C++客户 ...

  5. 在Android中调用KSOAP2库访问webservice服务出现的服务端返回AnyType{}

    最近在做毕业设计的时候,涉及到了安卓端访问web service服务端数据库,并返回一个值,当我把web service测试通过后,想写一个简单的安卓测试程序,来实现服务端数据库访问,通过web se ...

  6. axis客户端循环访问webservice的时候只发送了几条数据就断开了的问题

    原因 axis客户端访问webservice默认是使用http1.0版本的,这个版本的http不能保持长连接,应该换成http1.1版本 具体修改步骤: <?xml version=" ...

  7. 【.NET6】gRPC服务端和客户端开发案例,以及minimal API服务、gRPC服务和传统webapi服务的访问效率大对决

    前言:随着.Net6的发布,Minimal API成了当下受人追捧的角儿.而这之前,程序之间通信效率的王者也许可以算得上是gRPC了.那么以下咱们先通过开发一个gRPC服务的教程,然后顺势而为,再接着 ...

  8. C++访问WebService gSoap方式

    一.             gSOAP访问WebService 1.      下载gSOAP gSOAP 2.7.17 版下载地址http://sourceforge.net/projects/g ...

  9. php——SoapClient访问webservice

    原文:php--SoapClient访问webservice 通过SoapClient调用天气预报 <?phpheader ( "Content-Type: text/html; ch ...

随机推荐

  1. RAID卡 BBU Learn Cycle周期的影响

    背景 最近遇到有些带MegaSAS RAID卡的服务器,在业务高峰时突然IO负载飚升得很高,IO性能急剧下降,查了日志及各种设置最后才发现是RAID卡的Cache写策略由 WriteBack变成Wri ...

  2. Docker学习总结之Docker与Vagrant之间的特点比较

    以下内容均出自Vagrant作者(Mitchell Hashimoto)与Docker作者(Solomon Hykes)在stackoverflow上面一个问题讨论.在这个问题中,双方阐述了vagra ...

  3. gulp自动化ES6转ES5

    npm install --save-dev gulp npm install --save-dev gulp-babel npm install --save-dev babel-preset-es ...

  4. rzsz安装【转】

    环境:CentOS 发生情况:需要安装工具:szrz 工具进行 windows 和linux传文件 安装方式:从网上其他教程找的所以就按照如下方式操作 1. 下载软件 rzsz-3.34.tar.gz ...

  5. 【AUC】二分类模型的评价指标ROC Curve

    AUC是指:从一堆样本中随机抽一个,抽到正样本的概率比抽到负样本的概率大的可能性! AUC是一个模型评价指标,只能用于二分类模型的评价,对于二分类模型,还有很多其他评价指标,比如logloss,acc ...

  6. uva10160(dfs+状态压缩)

    题意:给出n个点,以及m条边,这些边代表着这些点相连,修一个电力站,若在某一点修一个站,那么与这个点相连的点都可以通电,问所有的点都通电的话至少要修多少个电力站........ 思路:最多给出的是35 ...

  7. 查看局域网其它电脑的计算机名和IP

    一.下面脚本可查看局域网中的电脑计算机名和IP,保存下面文本至记事本.后缀改成bat COLOR 0A CLS @ECHO Off Title 查询局域网内在线电脑IP :send @ECHO off ...

  8. 搭建一个单纯学习hibernate的项目

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  9. 【C#】遍历List列表的同时,移除访问到的元素

    需求:遍历List列表,当访问的元素符合某一条件时,将该元素移除出列表. 注意点:使用foreach循环遍历无法做到边读边修改,所以要使用for循环. 例子: // 倒序遍历. for (int i ...

  10. buildroot 制作的文件系统烧入到nand中打开设备没有权限

    利用buildroot 制作的文件系统,启动系统加载文件系统后出现打开设备Permission denied 解决方法记录. 这应该是制作文件系统的机制问题,暂时没有搞清楚为什么. 解决方式: 给生成 ...