// soapconsole.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
////////////////////////////////////////////////////////////////////////////////
//步骤
//1.导入类型库
//2.需要创建一个SoapConnector  
//3.下一步创建SoapSerializer  
//4.下一步把消息附加到SoapConnector的输入流  
//5.下一步读取结果.要读取服务器的回复,客户端应用需要使用SoapReader,
// 6.SoapReader被连接到SoapConnector输出流  
// 7.用IXMLDOMElement对象可以从SoapReader里读到服务器的回复  
///////////////////////////////////////////////////////////////////////////////
void Add()
{
 try
 {
 //SoapSerializer用于序列化(串行化),创建,封装SOAP消息.用来构建一个向Web服务发送的SOAP消息
 ISoapSerializerPtr Serializer;
 //SoapReader将SOAP消息解析为一个DOM模型,并提供一系列操作该DOM模型的方法
 ISoapReaderPtr  Reader;
 //SoapConnector在对象之间发送和接收SOAP消息的传输协议
 ISoapConnectorPtr Connector;
 //创建一个Connector对象
 Connector.CreateInstance(__uuidof(HttpConnector30));
 //Web服务是由Property(HttpConnector的一个属性)指定的
 //在处理这一属性时有件事情需要指定:我们引用的哪个属性以及该属性的值
 //EndPointURL属性指定Web服务
 Connector->Property["EndPointURL"] = "http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl";//web服务的URL
 ////////////////////////////////////////////////////////////////////////////
 //Connector->Property[参数]说明,对大小写敏感
// AuthPassword: 端点认证用的口令。
// AuthUser:  端点认证用的用户名
// EndPointURL : 端点的URL
// ProxyPassword: 代理认证的口令
// ProxyPort : 代理服务器使用的端口
// ProxyServer : 代理服务器的IP地址或主机名
// ProxyUser : 代理认证的用户名
// SoapAction: HTTP头部中SoapAction中的值。这个属性只使用于低级API。它将忽略SoapClient接口(高级API)中的ConnectorProperty属性 。
// SSLClientCertificateName:指定使用Secure Sockets Layer (SSL)加密协议(如果存在,则该字符串标明用于SSL协议中的客户端证书)。语法如下:
//  [CURRENT_USER | LOCAL_MACHINE\[store-name\]]cert-name with the defaults being CURRENT_USER\MY (与Microsoft Internet Explorer用法相同)。
// Timeout:  HttpConnector的超时限制,以毫秒为单位。
// UseProxy:  一个类型为布尔型的属性,表明是否使用代理服务器。缺省情况下,这一属性的值被设定为False,表明无需使用代理服务器。如果要使用代服务器,需要将该属性的值设置为True。如果将该属性的值设置为True, 而又没有设置ProxyServer属性,HttpConnector将使用IE中设置的代理服器。HttpConnector会忽略IE中的“不使用代理服务器”设置。
// UseSSL:  表明是否使用了SSL的布尔型值。如果该属性被设置为True,则无论WSDL中是否指定了HTTP或HTTPS,HttpConnector对象都使用SSL连接。
//     如果该属性的值被设置为False,则只有在WSDL中指定了HTTPS的情况下, HttpConnector对象才会使用SSL连接
// 详细请参考:http://www.codesky.net/article/200504/62841.html
 ///////////////////////////////////////////////////////////////////////////
 
 Connector->Connect();
 //开始消息
 Connector->Property["SoapAction"] = "http://WebXml.com.cn/getWeatherbyCityName";
 //开始SOAP消息
 //在完成与Web服务的连接和其他的细节后,我们就可以调用向服务器发送SOAP信息的方法了,必须在调用SoapSerializer的其他方法之前调用该方法
 Connector->BeginMessage();
 //创建SoapSerializer对象
 Serializer.CreateInstance(__uuidof(SoapSerializer30));
 //将serializer连接到connector的输入字符串
 //在与服务器连接前,SoapSerializer对象必须与SoapConnector对象连接。
 //为了使这二个对象相互连接,我们需要调用SoapSerializer对象的Init方法,该方法需要一个参数InputStream(向服务器发送数据的流)
 Serializer->Init(_variant_t((IUnknown*)Connector->InputStream));
 //创建SOAP消息
 //开始处理SOAP消息,
 //第一个参数是命名空间,缺省为SOAP-ENV,第二个参数定义URL,第三个参数定义Serialzier->startBody("")函数的编码方式。
 Serializer->StartEnvelope("","","");
 //开始处理Body元素,参数为URI的编码类型,缺省为NONE
 Serializer->StartBody("");
 //开始处理Body里的子元素
 //第一个参数是元素名,第二个参数是URL,第三个参数是编码类型,第四个参数是元素的命名空间
 Serializer->StartElement("getWeatherbyCityName",    "http://WebXml.com.cn/","","soap");
 //WebXml.com.cn是Web服务所属的名称空间(如果Web服务提供者没有指定名称空间,将会使用该默认名称空间)。
 Serializer->StartElement("theCityName","","","soap");
 //写入元素值,
 Serializer->WriteString("郑州");
 //上面的每个startXXX函数后都要有相应的endXXX函数来结尾
 Serializer->EndElement();
 Serializer->EndElement();
 Serializer->EndBody();
 Serializer->EndEnvelope();
 //消息做完之后,连接器就调用endMessage()方法将消息发送到服务器
 Connector->EndMessage();
 //创建响应soap消息
 Reader.CreateInstance(__uuidof(SoapReader30));
 //OutPutStream来读取SoapReader对象中的信息
 //将reader连接到connector的输出字符串
 Reader->Load(_variant_t((IUnknown*)Connector->OutputStream),"");
 //将回应信息加载到SoapReader对象后,就可以用它的RpcResult属性来获取结果,
 //但是RpcResult并不直接返回结果,它返回Body的第一个实体元素
 //然后用text属性读取该元素的属性值
 printf("%s\n",(const char*)Reader->RpcResult->text);
 }
 catch(_com_error &e)
 {
  printf("%s",e.ErrorMessage());
 }
}

int main(int argc, char* argv[])
{
 CoInitialize(NULL);
 Add();
 CoUninitialize();
 return 0;
}

C++利用SOAP开发WebService的更多相关文章

  1. 利用NuSoap开发WebService(PHP)

    利用NuSoap开发WebService(PHP) 分类: php 2010-09-08 12:00 5005人阅读 评论(1) 收藏 举报 webservicephpsoapstringencodi ...

  2. [转] WebService开发笔记 1 -- 利用cxf开发WebService竟然如此简单

    以下文章来自   http://www.blogjava.net/jacally/articles/186655.html 现在的项目中需要用到SOA概念的地方越来越多,最近我接手的一个项目中就提出了 ...

  3. java开发webservice的几种方式(转载)

    webservice的应用已经越来越广泛了,下面介绍几种在Java体系中开发webservice的方式,相当于做个记录. 1.Axis2方式 Axis是apache下一个开源的webservice开发 ...

  4. JAVA开发WEBSERVICE方式

    webservice的应用已经越来越广泛了,下面介绍几种在Java体系中开发webservice的方式,相当于做个记录. 1.Axis2方式 Axis是apache下一个开源的webservice开发 ...

  5. php 如何利用 soap调用.Net的WebService asmx文件

    原文:php 如何利用 soap调用.Net的WebService asmx文件 最近,帮一个同行测试用.net写的WebService接口,C#调用通过,现在需要测试一下php版本对它的调用,经过各 ...

  6. C# 开发XML Web Service与Java开发WebService

    一.web service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量 ...

  7. Axis2开发WebService客户端 的3种方式

    Axis2开发WebService客户端 的3种方式 在dos命令下   wsdl2java        -uri    wsdl的地址(网络上或者本地)   -p  com.whir.ezoffi ...

  8. 2.使用JDK开发webService

    使用jdk开发webService需要注意:jdk版本必须1.6以及1.6以上! 以下webService的组成部分: server端和client端,通过服务器端(server)webService ...

  9. 利用JAX-WS 开发web服务

    近日在学习Rogers Candenhead的第六版的<Java 入门经典>第22章.利用JAX-WS 开发web服务,简略总结而言主要包括以下几个步骤: 1.定义服务端点接口类: 主要就 ...

随机推荐

  1. noi2019模拟测试赛(四十七)

    noi2019模拟测试赛(四十七) T1与运算(and) 题意: ​ 给你一个序列\(a_i\),定义\(f_i=a_1\&a_2\&\cdots\&a_i\),求这个序列的所 ...

  2. ZJOI2017线段树

    ZJOI2017线段树 题意: ​ 给你一颗广义线段树,太长了,自己去看. 题解: ​ 直接上zkw那一套,把闭区间换成开区间,就是把取\([l,r]\),变成取\([l-1,l-1],[r+1,r+ ...

  3. 2017国家集训队作业[agc008f]Black Radius

    2017国家集训队作业[agc008f]Black Radius 时隔4个月,经历了省赛打酱油和中考各种被吊打后,我终于回想起了我博客园的密码= = 题意: ​ 给你一棵树,树上有若干个关键点.选中某 ...

  4. 【DRF视图】

    目录 开始使用内置视图 请结合[DRF序列化]此文献中的数据文件及序列化文件来阅读如下代码. DRF视图为我们提供了非常简便的方法--内置了增删改查等一系列的操作. 我们只需在url中指定对应的方法, ...

  5. Knockout 重新绑定注意要点

    function ReImport(id) { //点击按钮时调用函数名称, var node = document.getElementById('bindingNode'); //bindingN ...

  6. python版 百度签到

    经常玩贴吧,刚学python ,所以自己弄了一个python版的签到程序.自己的东西总是最好的. 登陆模块参考的http://www.crifan.com/emulate_login_website_ ...

  7. Python批量重命名指定目录下文件的两种方法

    #法一 import os path = "C://Python34//" for file in os.listdir(path): if os.path.isfile(os.p ...

  8. EasyUI——DataGrid中嵌入Radio

    前一篇博客写到项目中的广告位管理,当时没有写到今天的问题,这个问题当时也是困扰我好久. 经过自己的努力和同志们的帮助,最后最终解决. 实现要求把全部的广告位后面的单选button设成一组,目的是一个广 ...

  9. amazeui的表单开关插件的自定义事件必须添加.bootstrapSwitch 命名空间,给了我们什么启示

    amazeui的表单开关插件的自定义事件必须添加.bootstrapSwitch 命名空间,给了我们什么启示 一.总结 一句话总结:详细看使用文档(说明文档说的真的是非常详细呢,不过循序渐进,不同阶段 ...

  10. (F) linux sort,uniq,cut,wc命令详解

    F:http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858385.html sort sort 命令对 File 参数指定的文件中的行排序,并 ...