C++實現WebService__C++
最後更新:2018-07-25
來源:互聯網
上載者:User
一、引言
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