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(), 0, 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[7] = {"省份", "城市", "发布时间", "温度", "天气", "风向", "备注"}; 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; 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();
} }
|