gSOAP学习体会

2024-04-27 22:32
文章标签 学习体会 gsoap

本文主要是介绍gSOAP学习体会,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前一阶段写gSOAP 的文章没保存好,后来想写的,越学越没有写的勇气了,感觉自己很菜,但是现在感觉还是写点就算给入门者一点提示吧。另外虽说这篇文章是自己写的,但是却感觉是东拼西凑的,有很多别人的东西了。
   看了我转载的关于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方式连接的。
其中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
   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里面的文档,也很简单的,不过也要花点时间学习的了,呵呵。
如果对于上面程序,有谁没调试成功联系我,邮箱都写在程序里那。呵呵。
 

这篇关于gSOAP学习体会的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/941694

相关文章

linux设备上的Onvif 实现3:gsoap框架基础知识

一样可以在网上搜索到的参考资料,仅供参考。根据我的实践,这些都不能必然保证成功,后面我会详细列出我的实现步骤。 gsoap安装过程.doc GSoap工具的安装和使用.doc gSOAP服务开发指南V2._0.doc gSOAP学习体会.doc gsoap中文文档.pdf linux下gsoap使用及移植.pdf soapdoc2.pdf soap协议规范.doc WebServ

linux设备上的Onvif 实现4:成功编译gsoap 2.8.15

前言     本说明示例是gsoap 2.8.15     gsoap工具包中支持的平台是:linux386、macosx、win32,没有提供嵌入式arm平台,本文将指导完成交叉工具编译生成嵌入式平台工具。 工作目录:\\192.168.0.234\work\gaoht\gsoap   \gsoap-2.8\   解压后的目录   \target\      编译后的安装目录 交叉编译工具:T

MySQL入门学习-内置函数.一点学习体会

内置函数在 MySQL 中是非常有用的工具。通过对内置函数的学习,我对其功能和用法有了更深入的了解。        总结起来,内置函数提供了各种数据处理和操作的功能。它们可以帮助我们进行数学计算、字符串处理、日期和时间操作、数据类型转换等。通过使用内置函数,我们可以更高效地完成各种数据处理任务,减少代码量,提高数据库操作的简洁性和可读性。 一、以下是一些常用的内置函数举例: 1

UCOSIII学习体会

我是从2017年6月23日开始准备学习UCOSIII,并移植到STM32F103上,到2017年7月24日,结束UCOSIII的学习。这个过程肯定有血有泪有欢笑!   下面谈谈自己的学习体会。参考书籍是Labrosse的《嵌入式实时操作系统μC/OS-III 》、《STM32F1 UCOS开发手册_V2.0》以及战舰里的《ucos-iii知识点总结》,当然还有网上各位大神的博客等。 1、光

关于一些Java关键字的学习体会和心得

1 首先,访问权限修饰符           1.1  包访问权限                    包访问权限即是默认访问权限,有时也被表现为friendly。这就意味着,每一个使用默认访问权限的成员(包括类,属性,方法等)对当前包中的所有类都是开放的。                    由于一个编译单元(即一个文件),只能隶属于一个包,所以通过包访问权限,处于同一个编译单

细谈Slick(5)- 学习体会和将来实际应用的一些想法

通过一段时间的学习和了解以及前面几篇关于Slick的讨论后对Slick这个函数式数据库编程工具有了些具体的了解。回顾我学习Slick的目的,产生了许多想法,觉着应该从实际的工作应用角度把我对Slick目前能够达到的目的以及在现有功能优势和特点下如何进一步改进才能正真符合IT系统对数据库程序编程和运行效率的要求。想通过这篇博客把想法提出来跟大家分享一下,看看是否能够引起大家的共鸣,为我下一步的

SOAP/XML 关于C/C++ 语言的实现-gSOAP简介教程例子-gSOAP下载页面

源下载链接地址: https://sourceforge.net/projects/gsoap2/files/oldreleases/ 截止2020-1-19本说明时候,是2.8.97的版本 工作的工程代码里面含有gsoap的代码,对应版本是2.8.22的搜集来查看一下。 gSOAP编译工具提供了一个SOAP/XML 关于C/C++ 语言的实现,从而让C/C++语言开发web服务或客户端程序的

软件构造学习体会

在整个学习过程中,有一些力不从心的感觉,也是因为自己有些懈怠,导致最后的学习效果并不是特别好。课程所需的Java知识也很匮乏,虽然有一定C语言的基础,但是开课后直接需求用Java来编程做实验,还是有些慌乱的,整个做实验的过程就是在边学Java边做,导致效率也不是特别高、经常拖延。可以说,课程的难度和自己能力的不足让我对这门课程有些望而生畏、手足无措,加上自身学习比较慢、又没有比其他人付出的更多,感

gsoap应用---利用gsoap工具生成代码

1、gsoap是什么?           The gSOAP toolkit is an open source C and C++ software development toolkit for SOAP/XML Web services and generic (non-SOAP) C/C++ XML data bindings. The toolkit analyzes W

利用gSoap开发Web Service C/C++客户端

一. 开发环境准备 1. 从gSoap官方网站http://gsoap2.sourceforge.net 下载gSoap工具包。 本例下载的是2.7.15的版本。 2. 根据说明文档(README)配置安装gSoap工具包。 说明:   一般下载的gSoap工具包中已经包含了生成Web Service客户端需要用到的两个工具(可执行文件):wsdl2h和soapcpp2,一般在g