• VC++ 使用MSSOAP访问WebService天气服务(客户端开发)


    绪论

           本文介绍使用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[
    7];
        weather.getMessage(wea);
        
    for(int i = 0; i < 7; i++)
        {
            cout << wea[i] << endl;
        }

        cin.get();
        
    return 0;
    }



    // 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_
    #if _MSC_VER > 1000
    #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, e.Description(), 0NULL);
            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[
    7] = {"省份""城市""发布时间""温度""天气""风向""备注"};
            string str;

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

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

                
    if (i != 2 && i != 3 && i != 8 && i != 9)
                {
                    
    //cout<<item[j]<<":"<<str<<endl;
                    weather[j] = item[k] + ":" + str;
                    j++;
                    k++;
                }

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

        }
    }

  • 相关阅读:
    hibernate -- 分页模糊查询中setParameter 和setParameterList
    HTTP协议状态码详解(HTTP Status Code)
    远程桌面全屏显示
    将中文标点符号替换成英文标点符号
    MySQL 三种关联查询的方式: ON vs USING vs 传统风格
    java如何遍历map的所有的元素(各种方法)
    JS处理Cookie
    js追加子元素
    JAVA编程思想(2)
    1047. Student List for Course (25)
  • 原文地址:https://www.cnblogs.com/MakeView660/p/9186940.html
Copyright © 2020-2023  润新知