landuochong 发表于 2011-12-21 08:44

gsoap简单实例

<div id="blog_text" class="cnt"><div style="font-size: 12px;"><font color="#808080">前一阶段写gSOAP 的文章没保存好,后来想写的,越学越没有写的勇气了,感觉自己很菜,但是现在感觉还是写点就算给入门者一点提示吧。另外虽说这篇文章是自己写的,但是却感觉是东拼西凑的,有很多别人的东西了。<br>
   看了我转载的关于soap 的文章,大家想必对soap有所了解了吧,那么gSOAP是什么那?<br>
gSOAP
是一个开源的项目,用它可以方便的使用c/c++地进行SOAP客户端和服务器端编程,而不必了解xml和SOAP协议的细节。这样使用者就可以专注于自
己的web service
客户端或服务器端的编写,而不用纠缠与其它细节。我第一次接触这些东西,我对SOAP的理解是这样的:以http协议为基本的通信协议,以xml文件形式
请求远程服务,再以xml文件的形式返回执行结果,我理解的就这么简单了,有啥不妥处,还请指教阿。<br>
实践一下才有理性认识,下面是我自己在windows下,具体说来就是用vc 6.0下编写的一个很简单的客户端程序调用远程的服务,来发送电子邮件,感觉很爽吧。<br>
首先我们到</font> <a href="http://sourceforge.net/project/showfiles.php?group_id=52781" target="_blank"><font color="#808080">http://sourceforge.net/project/showfiles.php?group_id=52781</font> </a><font color="#808080">下载gSOAP下载工具集吧,不同的系统下用的gSOAP是不一样的,根据需要下载了windows下的和linux下的。<br>
gSOAP工具集不需要安装,直接解压就可以了。在/bin目录下我们可以看到两个可执行文件:<br>
soapcpp2.exe: gSOAP编译器,编译头文件生成服务器和客户端都需要的 c/c++文件。 <br>
wsdl2h.exe: 编译wsdl文件生成c/c++头文件。<br>
工具就算准备好了。<br>
其次,我们到</font> <a href="http://www.abysal.com/soap/AbysalEmail.wsdl" target="_blank"><font color="#808080">http://www.abysal.com/soap/AbysalEmail.wsdl</font> </a><font color="#808080">下载<br>
wsdl文件,假设保存文件名为:AbysalEmail.wsdl。所谓的wsdl文件翻译成中<br>
文就是网络服务描述文件了。我们用wsdl2h.exe工具来根据wsdl文件生成<br>
c/c++头文件,可以用-c选项是生成纯c的头文件,另外用-s选项是说明我们在<br>
程序中不使用stl,注意了默认我们是适用stl的。<br>
用如下命令:<br>
wsdl2h&nbsp;&nbsp; --t ../typemap.dat -o AbysalEmail.h AbysalEmail.wsdl<br>
既可以生成我们需要的AbysalEmail.h头文件了。这里文件名可以随便起了。<br>
将下载的gsoap的import里的stlvector.h中文件拷贝到当前的文件夹下,因为默认是使用stl的,所以需要它。<br>
然后执行soapcpp2 命令来生成存根程序,用如下命令:<br>
soapcpp2&nbsp;&nbsp; -C AbysalEmail.h<br>
-C&nbsp;&nbsp; 选项是只生成客户端的,默认是生成客户端和服务器端的,如果你在程序中使用了vector还要加上 –limport选项。<br>
即可以生存客户端存根程序和框架了。<br>
soapClient.cpp:编译客户端的需要的存根例程。<br>
soapC.cpp,soapH.h:用来序列化和反序列化c/c++不同数据类型。<br>
soapServer.cpp: 编译服务器端的需要的存根例程。<br>
soapXXXProxy.h: 生成的代理类的头文件,使用代理类时需要此文件。<br>
本程序为soapSendEmailBindingProxy.h。<br>
<br>
第三步,就是在vc中建个工程,设置如下:<br>
在vc6中建立工程,其源文件为:sendMailClient.cpp soapC.cpp <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   soapClient.cpp   stdsoap2.cpp<br>
头文件为:&nbsp;&nbsp;   AbysalEmail.h soapH.h soapStub.h stdsoap2.h&nbsp;&nbsp;   <br>
其他依赖文件为:basetsd.h&nbsp;&nbsp; sendemailbinding.nsmp<br>
stdsoap2.cpp stdsoap2.h是下载的gSOAP中包含的。<br>
另外在所需要的库中把wsock32.lib加上,gSOAP也是采用socket方式连接的。<br>
其中sendMailClient.cpp为我写的客户端程序,程序如下:<br>
<br>
#include "soapH.h"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 得到存根程序<br>
#include "SendEmailBinding.nsmap"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   //得到名称空间映射表<br>
#include &lt;iostream&gt;<br>
#include&nbsp;&nbsp; &lt;string&gt;<br>
#include "soapSendEmailBindingProxy.h"<br>
<br>
using namespace std;<br>
<br>
int main(int argc, char **argv) <br>
{<br>
      struct soap email_soap;<br>
      int result = -1;<br>
   SendEmailBinding&nbsp;&nbsp; EmailBind;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //生成代理类对象<br>
    _ns1__SendEmail&nbsp;&nbsp; sendEmail;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //web服务发送电子邮件对象<br>
   _ns1__SendEmailResponse&nbsp;&nbsp; Email_Response;&nbsp;&nbsp; //web 服务返回发送结果对象<br>
   string from = "mseaspring";<br>
   string to   = "David";<br>
   string sub = "Hello test!";<br>
   sendEmail.From = &amp;from;<br>
   sendEmail.FromAddress = "</font> <a href="mailto:mseaspring@hotmail.com"><font color="#808080">mseaspring@hotmail.com</font> </a><font color="#808080">";<br>
   sendEmail.MsgBody = "I want to test a web service!";<br>
   sendEmail.To = &amp;to;<br>
   sendEmail.ToAddress = "</font> <a href="mailto:mseaspring@gmail.com"><font color="#808080">mseaspring@gmail.com</font> </a><font color="#808080">";<br>
   sendEmail.Subject = ⊂<br>
<br>
      result = EmailBind.__ns1__SendEmail(&amp;sendEmail,&nbsp;&nbsp; &amp;Email_Response);<br>
      if (result != 0)<br>
      {<br>
                printf("soap error ,errcode = %d\n", result);<br>
      }<br>
      else<br>
      {<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"The result is :"&lt;&lt;Email_Response.ReturnCode&lt;&lt;endl;<br>
                cout&lt;&lt;"恭喜你,邮件发送成功!"&lt;&lt;endl;<br>
      }<br>
      return 0;<br>
}我程序中是采用代理类的方式编写的程序,不用代理类的代码如下:<br>
#include "soapH.h"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp; 得到存根程序<br>
#include "SendEmailBinding.nsmap"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   // 得到名称空间映射表<br>
#include &lt;iostream&gt;<br>
#include&nbsp;&nbsp; &lt;string&gt;<br>
using namespace std;<br>
<br>
int main(int argc, char **argv) <br>
{<br>
      struct soap email_soap;<br>
      //初始化gSoap运行时环境变量,只需初始化一次<br>
      soap_init(&amp;email_soap);<br>
      int result = -1;<br>
      //远程web服务的endpoint URL<br>
   const char* server="http://www.abysal.com/soap/soapmail.wdtp";<br>
   string from = "mseaspring";<br>
   string to   = "David";<br>
   string sub = "Hello test!";<br>
   sendEmail.From = &amp;from;<br>
   sendEmail.FromAddress = "</font> <a href="mailto:mseaspring@hotmail.com"><font color="#808080">mseaspring@hotmail.com</font> </a><font color="#808080">";<br>
   sendEmail.MsgBody = "I want to test a web service!";<br>
   sendEmail.To = &amp;to;<br>
   sendEmail.ToAddress = "</font> <a href="mailto:mseaspring@gmail.com"><font color="#808080">mseaspring@gmail.com</font> </a><font color="#808080">";<br>
   sendEmail.Subject = ⊂<br>
    //调用根据远程服务产生函数的接口<br>
result = soap_call___ns1__SendEmail(&amp;email_soap, server, "", &amp;sendEmail,&nbsp;&nbsp; &amp;Email_Response);<br>
      if(email_soap.error)<br>
      {<br>
                //在stderr流中打印soap的错误信息<br>
                soap_print_fault(&amp;email_soap,stderr);<br>
                result = email_soap.error;<br>
      }<br>
    soap_destroy(&amp;email_soap);// 删除反序列化类的实例,仅用于c++<br>
      soap_end(&amp;email_soap);    // 清空已经并行化的数据<br>
      soap_done(&amp;email_soap);   // 与gSOAP 环境相分离,关闭连接<br>
      if (result != 0)<br>
      {<br>
                printf("soap error ,errcode = %d\n", result);<br>
      }<br>
      else<br>
      {<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"The result is :"&lt;&lt;Email_Response.ReturnCode&lt;&lt;endl;<br>
                cout&lt;&lt;"恭喜你,邮件发送成功!"&lt;&lt;endl;<br>
      }<br>
      return 0;<br>
}<br>
你可能会问我怎么知道远程服务的接口阿? 到soapStub.h中去找就可以了,至于代理类的使用,到代理类头文件中一看便知。</font> </div></div>
               
               
               
               
页: [1]
查看完整版本: gsoap简单实例