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
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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.