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.hsendemailbinding.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; SendEmailBindingEmailBind; //生成代理类对象 _ns1__SendEmailsendEmail; //web服务发送电子邮件对象 _ns1__SendEmailResponseEmail_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; } |
本文地址:http://www.45fan.com/a/luyou/67534.html