CentOS6.5下編繹gSoap相關問題及解決

一,開發環境準備:
1,centos爲虛擬下安裝,版本爲32位,(64位同樣可以,均測過,需注意的是紅色部分內容)

下載下來解壓縮,按正常安裝過程進行編譯、安裝。
# tar zxvf gsozp_2.7.12.tar.gz 
# cd gsoap_2.7.12 
#./configure或 {./configure –-prefix=/usr/local/gSOAP(指定安裝路徑) }
# make 
# make install

問題: ../../ylwrap: line 111: yacc: command not found

原因:
沒有安裝:yacc(Yet Another Compiler Compiler),是Unix/Linux上一個用來生成編譯器的編譯器(編譯器代碼生成器)。

解決方案:
sudo apt-get install flex bison(ubantu)
yum install byacc(centos)

問題:gsoap-2.7/missing: line 46: flex: command not found
解決方法: yum install flex(要重新運行./configure)(centos下)
apt-get install flex(ubantu)

問題:/usr/bin/ld: cannot find -ly
解決方法:yum install bison-devel(centos)
apt-get install bison(ubantu)

問題:../../gsoap/stdsoap2.h:690:19: error: zlib.h: No such file or directory
解決方法:缺少zlib,ubantu下, apt-get install zlib-devel
centos下, yum install zlib-devel;

問題:error: openssl/bio.h: No such file or directory
解決方法:yum install openssl-devel(centos)
ubantu下:
sudo apt-get install openssl
爲了安裝OpenSSL通常的庫文件,首先使用以下命令來確定在Ubuntu系統中可獲得的庫文件的應用版本:
sudo apt-cache search libssl | grep SSL 
sudo apt-get install libssl-dev

至此基本可以了,

下面執行, 
make;
make install;

+--------------------------------------------------------+
| You now have successfully built and installed gsoap.   |
|                                                        |
| You can link your programs with -lgsoap++ for          |
| C++ projects created with soapcpp2 and you can link    |
| with -lgsoap for C projects generated with soapcpp2 -c |
|                                                        |
| There are also corresponding libraries for SSL and     |
| zlib compression support (-lgsoapssl and lgsoapssl++)  |
| which require linking -lssl -lcrypto -lz               |
|                                                        |
| Thanks for using gsoap.                                |
|                                                        |
|               http://sourceforge.net/projects/gsoap2   |
+--------------------------------------------------------+
出現此即安裝成功;

二, 開發linuxWeb Service C/C++客戶端

這裏,我們直接採用gSoap工具包自帶的wsdl2hsoapcpp2工具。

1. 基本流程

Web服務提供者處獲取Web ServiceWSDL文件,通常是一個URL

如:http://www.cs.fsu.edu/~engelen/calc.wsdl

當然也可以是一個WSDL形式的XML文件。

2. 使用gSoap工具wsdl2h,根據WSDL生成一個C/C++語法結構的頭文件。

如:wsdl2h -s -o calc.h http://www.cs.fsu.edu/~engelen/calc.wsdl

這一步將會得到一個頭文件,如:calc.h

該步的目的:實現WSDL文件到.h文件的數據映射。

3. 使用gSoap的預編譯器soapcpp2,根據上一步得到的頭文件來生成存根文件(soapStub.h)和客戶端代碼框架。

如:soapcpp2 -i -x -C -L calc.h

這一步將會得到幾個. nsmap.h.cpp文件,如:calc.nsmapsoapC.cppsoapH.hsoapStub.hsoapcalcProxy.cppsoapcalcProxy.h

該步的目的:生成相應的底層通信代碼。

4. 實現客戶端例程

在這一步可以簡單地編寫一個main函數,如:(注意包含的頭文件)

#include "calc.nsmap"

#include "soapcalcProxy.h"  //該頭文件已經包含了soapH.h

int main(void)

{

printf("very good!/n");

calcProxy service;

{

double result;

if(service.pow(2, 10, result) == SOAP_OK)

{

std::cout << "The value of 2^10 is " << result << std::endl;

}

}

return 0;

}

5. 用gcc編譯客戶端,生成可執行代碼

    編譯需要的文件有:第3步生成的所有文件、第4步編寫的main函數所在的文件,以及gsoap目錄下的stdsoap2.hstdsoap2.cpp文件共9個文件。

如:calc.nsmapsoapC.cppsoapH.hsoapStub.hsoapcalcProxy.cppsoapcalcProxy.hstdsoap2.cppstdsoap2.hmain.cpp

三、注意事項

1 wsdl2h的用法(WSDL/schema 解析和代碼生成器)

wsdl2h [opt] 頭文件名 WSDL文件名或URL 

wsdl2h常用選項

-o 文件名,指定輸出頭文件 

-n 名空間前綴 代替默認的ns 

-c 產生純C代碼,否則是C++代碼 

-s 不要使用STL代碼 

-t 文件名,指定type map文件,默認爲typemap.dat 

-e 禁止爲enum成員加上名空間前綴 

type map文件用於指定SOAP/XML中的類型與C/C++之間的轉換規則,比如在wsmap.dat裏寫

在本例中,使用的是:wsdl2h -s -o calc.h http://www.cs.fsu.edu/~engelen/calc.wsdl

參數s就表示生成不帶STLC/C++語法結構的頭文件calc.h

如果不用s就會生成帶STL的頭文件,這樣,在後邊的編譯中需要加入STL的頭

stlvector.h,位於:gsoap/import/目錄下。

soapcpp2的用法(編譯和代碼生成器)

soapcpp2 [opt] 頭文件名

soapcpp2常用選項

-C 僅生成客戶端代碼 

-S 僅生成服務器端代碼 

-L 不要產生soapClientLib.csoapServerLib.c文件 

-c 產生純C代碼,否則是C++代碼(與頭文件有關

-I 指定import路徑(見上文) 

-x 不要產生XML示例文件 

-i 生成C++封裝(代理),客戶端爲xxxxProxy.h(.cpp),服務器端爲xxxxService.h(.cpp)

本例中,使用的是:soapcpp2 -i -x -C -L calc.h

gSoap工具wsdl2soapcpp所生成文件的簡單分析

(1) wsdl2生成的具有C/C++語法結構的頭文件,其作用就是:將XML語法結構的WSDL文件映射爲C/C++語法結構的.h文件;併爲下一步做準備。

(2) soapcpp(採用參數:-i -x -C -L)生成的文件共有6個文件:PlayerBeanPortBinding.nsmapsoapC.cppsoapH.hsoapPlayerBeanPortBindingProxy.cppsoapPlayerBeanPortBindingProxy.hsoapStub.h

a. PlayerBeanPortBinding.nsmap文件

該文件的作用:An XML-to-C/C++ namespace mapping table,即WSDL文件與生成的客戶端代碼框架的一個名字空間的映射表。

b. soapStub.h

該文件就是直接由wsdl2生成的頭文件轉化而來,它詳細定義了WSDL所描述的各項服務和數據結構。

它是soap的存根文件,定義了由wsdl2生成的頭文件裏對應的遠程調用模型(RPC)。

c. soapPlayerBeanPortBindingProxy.soapPlayerBeanPortBindingProxy.cpp

這兩個文件是客戶端代碼的一個簡單封裝,它封裝了底層通信,並向外提供一個很簡單的界面,該界面展示了用戶能夠使用的所有服務(由WSDL所描述)。

d. soapH.hsoapC.cpp

這個兩個文件是soap的序列和反序列化代碼,

:設置字符編碼

   在利用gSoap編寫Web Service客戶端和服務器端的程序時,需要設置其編碼

           方式。接口爲:soap_set_mode,其實它是就是一個宏:

#define soap_set_mode(soap, n) ((soap)->imode |= (n), (soap)->omode |= (n))

如果要設置爲UTF8

可以這樣調用:soap_set_mode(&soap, SOAP_C_UTFSTRING);

詳細信息可參考該宏所在文件:stdsoap2.h



原文鏈接:http://www.360doc.com/content/14/1020/14/14679766_418395018.shtml

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章