天天看點

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   --t ../typemap.dat -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 = " [email protected] ";

sendEmail.MsgBody = "I want to test a web service!";

sendEmail.To = &to;

sendEmail.ToAddress = " [email protected] ";

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"          // 得到名稱空間映射表

//初始化gSoap運作時環境變量,隻需初始化一次

soap_init(&email_soap);

//遠端web服務的endpoint URL

const char* server="http://www.abysal.com/soap/soapmail.wdtp";

//調用根據遠端服務産生函數的接口

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 環境相分離,關閉連接配接

你可能會問我怎麼知道遠端服務的接口阿? 到soapStub.h中去找就可以了,至于代理類的使用,到代理類頭檔案中一看便知。

好了,終于要寫完了,當然我們不僅可以編寫用戶端也可以編寫伺服器端程式,至于伺服器端,有興趣的可以自己看看gSOAP裡面的文檔,也很簡單的,不過也要花點時間學習的了,呵呵。

如果對于上面程式,有誰沒調試成功聯系我,郵箱都寫在程式裡那。呵呵。

繼續閱讀