C++實現WebService

一、引言 
    Web Service其實就是一個應用程序,它向外界暴露出一個能夠通過Web進行調用的API,開發人員可以用編程的方法通過Web調用來實現某個功能的應用程序。從深層次上看,Web Service是一種新的Web應用程序分支,它們是自包含、自描述、模塊化的應用,可以在網絡(通常爲Web)中被描述、發佈、查找以及通過Web來調用。 Web服務給人們帶來許多令人喫驚的好處,它具有在完全不同平臺之間和互操作性,在無處不在的網絡上調用另一種Web服務的能力。由於web服務使用http協議通信(通常使用80端口),因此天然地可以穿越防火牆。另外,我們可以使用各種語言來開發和調用Web服務,有利於企業業務的集成和數據重用。


    如上所述,我們可以使用各種語言開發web服務,但主要以Java和.NET爲主,用C/C++開發web服務的工具不多,主要有Axis C++和gSoap。相比於Java版的Axis,Axis C++在安裝配置和開發部署新的Web服務都比較複雜,開發時要關注每一個細節,因爲Axis C++[1]本身並沒有詳細的日誌信息,當出現錯誤的時候很難跟蹤哪個環節出了問題。另外,Axis C++對WSDL信息的內容要求非常嚴格,而且往往找不到問題所在。雖然存在一些問題,但是Axis C++在性能上還是很有優勢,也因此是許多Web服務開發者的首選。[2]
    至於Axis C++的安裝配置,請參考其官方文檔[1]。另外,還可以使用gSoap[3]來開發C/C++的Web服務。 gSoap是一個開源項目,可以從SourceForge下載。


二、基本過程
   使用Axis C++開發Web服務的基本過程可以簡單描述如下:
   1、使用Java語言描述WEB服務
   2、使用Java2WSDL工具生成WSDL文件
   3、使用WSDL2Ws工具生成服務端代碼框架
   4、編碼實現service,並部署服務
   5、使用WSDL2Ws工具生成客戶端代碼框架
   6、編碼實現客戶端
三、實例演示
   這裏以一個簡單的加法Add服務來說明用Axis C++構建webService的過程。


1、使用Java語言描述WEB服務
   Axis C++中我們必須先定義好WSDL後方可生成用來實現該服務的代碼框架,這一點與Axis Java不同。生成WSDL方法很多,可以使用Java2WSDL工具,當然也可以手工編寫,這裏我們使用Java2WSDL工具生成。下面我們對Add服務用Java語言描述:
   
  public interface Add{
     public int add(int x, int y);
  }


  我們只要方法的聲明即可,不需要實現方法,因此我們使用接口來定義。將上面的代碼保存爲Add.java。


2、使用Java2WSDL工具生成WSDL文件
   javac Add.java   (生成.class文件)
   java -Djava.ext.dirs=$AXISCPP_HOME/lib/axisjava  org.apache.axis.wsdl.Java2WSDL -o Add.wsdl -l"http://localhost/axis/Add" -n"http://localhost/axis/Add" Add  


   經過上面兩步,我們就可以得到Add.wsdl文件。需要說明的是,生成的WSDL文件有時會有錯(intf都成了impl),這可能是Java2WSDL工具的Bug。如果出現這種情況,可以和Axis C++自帶的例子WSDL文件對比。(注:我花了兩天時間才找出這個問題)
  
3、使用WSDL2Ws工具生成服務端代碼框架
   有上面的WSDL文件,我們可以用WSDL2Ws工具生成服務端構架。
   java -Djava.ext.dirs=$AXISCPP_HOME/lib/axisjava -cp $AXISCPP_HOME/lib/axis/wsdl2ws.jar org.apache.axis.wsdl.wsdl2ws.WSDL2Ws Add.wsdl -lc++ -sserver
   
   -s server 表示生成server代碼框架
   -l c++    表示生成C++代碼
   
4、編碼實現service,並部署服務
   上面生成的文件中,我們只需要實現Add.cpp中的add方法即可。
   ... ...
   xsd__int Add::add(xsd__int Value0, xsd__int Value1)
   {
     return Value0+Value1;
   }
   ... ...
     
   對代碼編譯並鏈接生成.so動態庫:
   g++ -shared -I$AXISCPP_HOME/include -o libadd.so *.cpp
   
   對服務進行部署,步驟如下:
   (1).將生成的libadd.so文件複製至$AXISCPP_DEPLOY/lib目錄
   (2).複製Add.wsdl文件至$AXISCPP_DEPLOY/wsdls目錄
   (3).編輯AXISCPP_DEPLOY/etc/server.wsdd文件並在相應位置添加如下內容:
       <service name="Add" provider="CPP:RPC" description="Add Service ">
             <parameter name="className" value="/apache/axiscpp/lib/libadd.so"/>
      <parameter name="allowedMethods" value="add "/>
       </service>
   (4).重新啓動HTTP服務
   (5).檢查http://localhost/axis是不否有新增的Add服務


   爲了測試我們發佈的Web服務是否工作正常,我們下面利用Axis C++來生成調用該服務的客戶端代碼並進行測試。


5、使用WSDL2Ws工具生成客戶端代碼框架
   java -Djava.ext.dirs=$AXISCPP_HOME/lib/axisjava -cp $AXISCPP_HOME/lib/axis/wsdl2ws.jar org.apache.axis.wsdl.wsdl2ws.WSDL2Ws Add.wsdl -lc++ -sclient
   
   -s client 表示生成client代碼框架
   -l c++    表示生成C++代碼


6、編碼實現客戶端   
   上述命令生成了Add.hpp, Add.cpp,我們再編寫客戶端入口程序 AddClient.cpp:
   #include "Add.hpp"
   #include <stdio.h>
                                                                                                   
   int main(int argc, char** argv)
   {
     Add ws("http://localhost/axis/Add");
     int sum;
     if(argc<2)
     {
       printf("Usage:%s num1 num2\n", argv[0]);
       return -1;
     }
     sum = ws.add(atoi(argv[1]),atoi(argv[2]));
     printf("%d\n",sum);
     return 0;
  }


  編譯客戶端,生成可執行文件:
  g++ -I$AXISCPP_HOME/include -L$AXISCPP_DEPLOY/lib -laxis_client -ldl -o Add *.cpp


  之後,可以用Add命令測試服務工作是否正常。
 


四、參考文獻
1、官方網站:http://ws.apache.org/axis/
2、Linux下使用Axis C++構建Web服務:http://www.javayou.com/showlog.jspe?log_id=580
3、用C實現WebService:http://www.hnlinux.net/bbs/simple/index.php?t2303.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章