vc++2008 采用GSoap访问 WebService
看了我转载的关于soap 的文章,大家想必对soap有所了解了吧,那么gSOAP是什么那?
gSOAP 是一个开源的项目,用它可以方便的使用c/c++地进行SOAP客户端和服务器端编程,而不必了解xml和SOAP协议的细节。这样使用者就可以专注于自 己的web service 客户端或服务器端的编写,而不用纠缠与其它细节。我第一次接触这些东西,我对SOAP的理解是这样的:以http协议为基本的通信协议,以xml文件形式 请求远程服务,再以xml文件的形式返回执行结果,我理解的就这么简单了,有啥不妥处,还请指教阿。
实践一下才有理性认识,下面是我自己在windows下,具体说来就是用vc 6.0下编写的一个很简单的客户端程序调用远程的服务,来发送电子邮件,感觉很爽吧。
首先我们到 http://sourceforge.net/project/showfiles.php?group_id=52781下载gSOAP下载工具集吧,不同的系统下用的gSOAP是不一样的,根据需要下载了windows下的和linux下的。
gSOAP工具集不需要安装,直接解压就可以了。在/bin目录下我们可以看到两个可执行文件:
soapcpp2.exe: gSOAP编译器,编译头文件生成服务器和客户端都需要的 c/c++文件。
wsdl2h.exe: 编译wsdl文件生成c/c++头文件。
工具就算准备好了。
其次,我们到 http://www.abysal.com/soap/AbysalEmail.wsdl下载
wsdl文件,假设保存文件名为:AbysalEmail.wsdl。所谓的wsdl文件翻译成中
文就是网络服务描述文件了。我们用wsdl2h.exe工具来根据wsdl文件生成
c/c++头文件,可以用-c选项是生成纯c的头文件,另外用-s选项是说明我们在
程序中不使用stl,注意了默认我们是适用stl的。
用如下命令:
wsdl2h -o AbysalEmail.h AbysalEmail.wsdl
既可以生成我们需要的AbysalEmail.h头文件了。这里文件名可以随便起了。
将下载的gsoap的import里的stlvector.h中文件拷贝到当前的文件夹下,因为默认是使用stl的,所以需要它。
然后执行soapcpp2 命令来生成存根程序,用如下命令:
soapcpp2 -C AbysalEmail.h
-C 选项是只生成客户端的,默认是生成客户端和服务器端的,如果你在程序中使用了vector还要加上 –limport选项。
即可以生存客户端存根程序和框架了。
soapClient.cpp:编译客户端的需要的存根例程。
soapC.cpp,soapH.h:用来序列化和反序列化c/c++不同数据类型。
soapServer.cpp: 编译服务器端的需要的存根例程。
soapXXXProxy.h: 生成的代理类的头文件,使用代理类时需要此文件。
本程序为soapSendEmailBindingProxy.h。
第三步,就是在vc中建个工程,设置如下:
在vc6中建立工程,其源文件为:sendMailClient.cpp soapC.cpp 
                                    soapClient.cpp   stdsoap2.cpp
头文件为:      AbysalEmail.h soapH.h soapStub.h stdsoap2.h      
其他依赖文件为:basetsd.h  sendemailbinding.nsmp
stdsoap2.cpp stdsoap2.h是下载的gSOAP中包含的。
另外在所需要的库中把wsock32.lib加上,gSOAP也是采用socket方式连接的。(添加方法:项目->属性->连接器->输入->附加依赖项 添加wsock32.lib)
其中sendMailClient.cpp为我写的客户端程序,程序如下:
#include "soapH.h"                          // 得到存根程序
#include "SendEmailBinding.nsmap"            //得到名称空间映射表
#include <iostream>
#include  <string>
#include "soapSendEmailBindingProxy.h"
using namespace std;
int main(int argc, char **argv) 
{
        struct soap email_soap;
        int result = -1;
   SendEmailBinding  EmailBind;              //生成代理类对象
    _ns1__SendEmail  sendEmail;              //web服务发送电子邮件对象
   _ns1__SendEmailResponse  Email_Response;  //web 服务返回发送结果对象
   string from = "mseaspring";
   string to   = "David";
   string sub = "Hello test!";
   sendEmail.From = &from;
   sendEmail.FromAddress = " mseaspring@hotmail.com";
   sendEmail.MsgBody = "I want to test a web service!";
   sendEmail.To = &to;
   sendEmail.ToAddress = " mseaspring@gmail.com";
   sendEmail.Subject = ⊂
result = EmailBind.__ns1__SendEmail(&sendEmail,  &Email_Response);
        if (result != 0)
        {
                printf("soap error ,errcode = %d\n", result);
        }
        else
        {
            cout<<"The result is :"<<Email_Response.ReturnCode<<endl;
                cout<<"恭喜你,邮件发送成功!"<<endl;
        }
        return 0;
}我程序中是采用代理类的方式编写的程序,不用代理类的代码如下:
#include "soapH.h"                          //  得到存根程序
#include "SendEmailBinding.nsmap"            // 得到名称空间映射表
#include <iostream>
#include  <string>
using namespace std;
int main(int argc, char **argv) 
{
        struct soap email_soap;
        //初始化gSoap运行时环境变量,只需初始化一次
        soap_init(&email_soap);
        int result = -1;
        //远程web服务的endpoint URL .不要带WSDL
   const char* server="http://www.abysal.com/soap/soapmail.wdtp";
   string from = "mseaspring";
   string to   = "David";
   string sub = "Hello test!";
   sendEmail.From = &from;
   sendEmail.FromAddress = " mseaspring@hotmail.com";
   sendEmail.MsgBody = "I want to test a web service!";
   sendEmail.To = &to;
   sendEmail.ToAddress = " mseaspring@gmail.com";
   sendEmail.Subject = ⊂
    //调用根据远程服务产生函数的接口
result = soap_call___ns1__SendEmail(&email_soap, server, "", &sendEmail,  &Email_Response);
        if(email_soap.error)
        {
                //在stderr流中打印soap的错误信息
                soap_print_fault(&email_soap,stderr);
                result = email_soap.error;
        }
    soap_destroy(&email_soap);// 删除反序列化类的实例,仅用于c++
        soap_end(&email_soap);    // 清空已经并行化的数据
        soap_done(&email_soap);   // 与gSOAP 环境相分离,关闭连接
        if (result != 0)
        {
                printf("soap error ,errcode = %d\n", result);
        }
        else
        {
            cout<<"The result is :"<<Email_Response.ReturnCode<<endl;
                cout<<"恭喜你,邮件发送成功!"<<endl;
        }
        return 0;
}
你可能会问我怎么知道远程服务的接口阿? 到soapStub.h中去找就可以了,至于代理类的使用,到代理类头文件中一看便知。
好了,终于要写完了,当然我们不仅可以编写客户端也可以编写服务器端程序,至于服务器端,有兴趣的可以自己看看gSOAP里面的文档,也很简单的,不过也要花点时间学习的了,呵呵。
如果对于上面程序,有谁没调试成功联系我,邮箱都写在程序里那。呵呵。
soap_set_mode(&soap, SOAP_C_UTFSTRING);
采用UTF-8的形式编码发送和接收到的文字,可防止中文乱码。
vc++2008 采用GSoap访问 WebService的更多相关文章
- C++访问WebService    gSoap方式
		
一. gSOAP访问WebService 1. 下载gSOAP gSOAP 2.7.17 版下载地址http://sourceforge.net/projects/g ...
 - SQL Server 2008 R2 根据.asmx访问WebService
		
.asmx 都是.Net 同系列,所以学习的时候会比较简单. 方法一: 步骤1.在浏览器打开.asmx地址可以到方法列表, 步骤2.点进方法列表会有SOAP调用的案例, 步骤3.SQL Server ...
 - SQL Server 2008 R2 根据WSDL访问WebService
		
参考网站:WebService学习整理(一)——客户端三种调用方式整理 自我概括: WebService 通过HTTP通讯,数据以XML格式传输使两个系统进行数据交互 SOAP 是访问协议(注明访问W ...
 - VS2010使用c++、gSOAP创建WebService 图文教程
		
VS2010使用c++.gSOAP创建的WebService 图文教程 环境 操作系统:Windows 7gsoap版本:2.8.32C++编译器/开发环境:Visual Studio 2010 gS ...
 - 在VC下采用ADO实现BLOB(Binary)数据的存储,读取,修改,删除。
		
在VC下采用ADO实现BLOB(Binary)数据的存储,读取,修改,删除. 作者:邵盛松 2009-09-05 前言 1关于的BLOB(Binary)数据的存储和读取功能主要参考了MSDN上的一篇& ...
 - asp.net访问WebService的各种方式
		
WebService的访问形式主要有:SOAP调用.XMLHTTP POST.GET调用.MicroSoft.XMLDOMC调用.webbehavior.htc调用 我们知道的在C#后台本地调用Web ...
 - gsoap创建webservice服务简单教程
		
版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] WebServicesoapgsoap 使用gsoap创建webservice服务 下载gsop 准备待导出的服务接口定义文件比 ...
 - C++客户端访问WebService VS2008
		
VS2008及之后的版本已经不支持使用C++开发WEBService服务了,如果要在VS上开发WEBService,需要使用C#开发语言. 一.gSOAP简介 gSOAP编译工具提供了一个基于SOAP ...
 - (转)Android访问webservice
		
纠正网上乱传的android调用Webservice方法. 1.写作背景: 笔者想实现android调用webservice,可是网上全是不管对与错乱转载的文章,结果不但不能解决问题,只会让人心烦 ...
 
随机推荐
- WEB-INF有关的目录路径总结、转向方式: forward 重定向方式: Redirect
			
WEB-INF有关的目录路径总结 1.资源文件只能放在WebContent下面,如 CSS,JS,image等.放在WEB-INF下引用不了. 2.页面放在WEB-INF目录下面,这样可以限制访问,提 ...
 - Linux网络检测手段汇总
			
1.iftop iftop可测量通过每一个套接字连接传输的数据:它采用的工作方式有别于nload.iftop使用pcap库来捕获进出网络适配器的数据包,然后汇总数据包大小和数量,搞清楚总的带宽使用情况 ...
 - ACM训练小结-2018年6月15日
			
今天题目情况如下:A题:给出若干条边的边长,问这些边按顺序能否组成一个凸多边形,并求出这个多边形的最小包含圆.答题情况:无思路.正解(某种):第一问很简单.对第二问,如果R大于可行的最小R,那么按照放 ...
 - Xshell 5  上传下载插件
			
#yum -y install lrzsz #rz 上传 sz用法: 下载一个文件 sz filename 下载多个文件 sz filename1 filename2 下载dir目录下的所有文件,不包 ...
 - dreamweaver8快捷键
			
替换Ctrl+H 处理表格 选择表格(光标在表格中) Ctrl+A 移 动到下一单元格Tab 移 动到上一单元格Shift+Tab 插入行(在当前行之前)Ctrl+M 在表格末插入一行 在最后一个单元 ...
 - centos7下安装tomcat7
			
1 安装说明安装环境:CentOS-7.0.1611安装方式:源码安装软件:apache-tomcat-7.0.75.tar.gz 下载地址:http://tomcat.apache.org/down ...
 - poj1753模拟
			
题目链接http://poj.org/problem?id=1573 题意:从第一行第k个出发按照已给的方向前进,问第几步走出去或第几步进入一个有多少步的循环. 就是按照题意模拟就好了. 代码写完了w ...
 - shell  计算文件交并差
			
交集 $ sort a b | uniq -d 并集 $ sort a b | uniq 差集a-b $ sort a b b | uniq -u 文件乱序 cat tmp.txt | awk 'BE ...
 - Nginad广告生成代码分析
			
大家都知道实时竞价的广告一般会在一个iframe中,这个iframe会有一个复杂的src.那么这个iframe是如何生成的? 这里分析NginAd作为exchange时,如何让媒体网站通过引用一段ad ...
 - 文件系统中跳转【TLCL】
			
pwd - Print name of current working directory cd - Change directory ls - List directory contents Lin ...