C++利用SOAP开发WebService
// 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的更多相关文章
- 利用NuSoap开发WebService(PHP)
利用NuSoap开发WebService(PHP) 分类: php 2010-09-08 12:00 5005人阅读 评论(1) 收藏 举报 webservicephpsoapstringencodi ...
- [转] WebService开发笔记 1 -- 利用cxf开发WebService竟然如此简单
以下文章来自 http://www.blogjava.net/jacally/articles/186655.html 现在的项目中需要用到SOA概念的地方越来越多,最近我接手的一个项目中就提出了 ...
- java开发webservice的几种方式(转载)
webservice的应用已经越来越广泛了,下面介绍几种在Java体系中开发webservice的方式,相当于做个记录. 1.Axis2方式 Axis是apache下一个开源的webservice开发 ...
- JAVA开发WEBSERVICE方式
webservice的应用已经越来越广泛了,下面介绍几种在Java体系中开发webservice的方式,相当于做个记录. 1.Axis2方式 Axis是apache下一个开源的webservice开发 ...
- php 如何利用 soap调用.Net的WebService asmx文件
原文:php 如何利用 soap调用.Net的WebService asmx文件 最近,帮一个同行测试用.net写的WebService接口,C#调用通过,现在需要测试一下php版本对它的调用,经过各 ...
- C# 开发XML Web Service与Java开发WebService
一.web service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量 ...
- Axis2开发WebService客户端 的3种方式
Axis2开发WebService客户端 的3种方式 在dos命令下 wsdl2java -uri wsdl的地址(网络上或者本地) -p com.whir.ezoffi ...
- 2.使用JDK开发webService
使用jdk开发webService需要注意:jdk版本必须1.6以及1.6以上! 以下webService的组成部分: server端和client端,通过服务器端(server)webService ...
- 利用JAX-WS 开发web服务
近日在学习Rogers Candenhead的第六版的<Java 入门经典>第22章.利用JAX-WS 开发web服务,简略总结而言主要包括以下几个步骤: 1.定义服务端点接口类: 主要就 ...
随机推荐
- css3--简单的加载动画
.load-container { width: 30%; height: auto; position: relative; margin: 1rem auto; } .load { width: ...
- LuoguP2764 最小路径覆盖问题(最大流)
题目描述 «问题描述: 给定有向图G=(V,E).设P 是G 的一个简单路(顶点不相交)的集合.如果V 中每个顶点恰好在P 的一条路上,则称P是G 的一个路径覆盖.P 中路径可以从V 的任何一个顶点开 ...
- js09--函数 call apply
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...
- 使用NPOI时写的几个辅助方法
简介:包含:获取单元格合并信息GetMergedCellAddress.获取引用单元格字符串ConvertAddressToString.获取单元格字符串格式内容CellValueToString p ...
- Navicat for MySQL 新建查询时,报can't create file ...系统找不到指定的文件夹出现问题
如图点击新建查询报错 解决办法 将这个路径修改一下就ok了
- F的ACM暑期集训计划
暑假的知识计划(补充中...) 1.数论相关 (7days) 待完成 多项式同余方程/高次同余方程/欧拉函数/克莱姆法则/高斯消元/莫比乌斯反演/伪素数判定/baby-step-gaint-step ...
- Js 栈和堆的实现
一.队列和堆栈的简单介绍 1.1.队列的基本概念 队列:是一种支持先进先出(FIFO)的集合,即先被插入的数据,先被取出! 1.2.堆栈的基本概念 堆栈:是一种支持后进先出(LIFO)的集合,即后被插 ...
- CISP/CISA 每日一题 13
监控信息系统人员所提供服务的效率和效果的工具: 1.例外报告:识别所有没有成功完成的或出了故障的应用 2.作业重运行报告:大多数异常终止作业都会导致重起 3.操作员问题报告:记录计算机运行问题及解决方 ...
- Windows Server 2016 上配置 APACHE+SSL+PHP+perl
Windows Server 2016 上配置 APACHE+SSL+PHP+perl 安装环境 谷歌云实例 Windows Server 2016 Apache Apache/2.4.25 (win ...
- 关于laravel框架分页报错的问题
因为laravel框架有自己的分页封装,所以与其他框架相比laravel框架的分页的实现要方便的多 只要分别在php脚本与视图中使用 $data=DB::table('index_pic')-> ...