gsoap使用筆記

gsoap入門

1 使用gsoap搭建web service

參考了參考文檔[2]中的介紹幼衰,有一點點修改秒咨。

1.1 編譯calc客戶端

  1. 根據(jù)wsdl文件生成gsoap用的頭文件
wsdl2h -o calc.h http://www.genivia.com/calc.wsdl
  1. 如果用我們自己搭建的webserver仓手,需要修改頭文件中的如下代碼两嘴,
    把port字段修改為自己的webservice的url歹嘹。
//gsoap ns2  service port:      http://websrv.cs.fsu.edu/~engelen/calcserver.cgi

改為

//gsoap ns2  service port:      http://localhost:9999/cgi-bin/calcserver.cgi
  1. 生成client proxy類的源代碼
soapcpp2 -j -CL -I/usr/share/gsoap/import calc.h

-j生成C++ proxy類享甸,供client調(diào)用截碴,-CL生成客戶端程序,-I指明gsoap相關(guān)頭文件路徑蛉威,這個根據(jù)gsoap安裝位置而定日丹,例子中的路徑是ubuntu通過apt-get安裝的gsoap的路徑。

  1. 編寫client程序calcclient.cpp
#include "calc.nsmap"      // XML namespace mapping table (only needed once at the global level)
#include "soapcalcProxy.h" // the proxy class, also #includes "soapH.h" and "soapStub.h"
int main()
{
  calcProxy calc;
  double sum;
  if (calc.add(1.23, 4.56, sum) == SOAP_OK)
    std::cout << "Sum = " << sum << std::endl;
  else
    calc.soap_stream_fault(std::cerr);
  calc.destroy(); // same as: soap_destroy(calc.soap);
  soap_end(calc.soap);
}

調(diào)用proxy類calcProxyadd方法蚯嫌,傳遞了2個參數(shù)1.23 4.56哲虾,打印結(jié)果。

  1. 編譯
c++ -o calcclient calcclient.cpp soapC.cpp soapcalcProxy.cpp -lgsoap++

如果第二步?jīng)]修改port的話择示,這時候執(zhí)行calcclient就能得到結(jié)果了束凑,如果修改了port,我們需要自己搭建一個webservice來提供calc服務(wù)栅盲。

1.2 搭建服務(wù)器

1.2.1 編譯服務(wù)器端程序

  1. 與client第一步一樣汪诉,生成calc.h
wsdl2h -o calc.h http://www.genivia.com/calc.wsdl
  1. 生成server端的接口類
soapcpp2 -j -SL -I/usr/share/gsoap/import calc.h
  1. 編寫cgi程序calcserver.cpp,實現(xiàn)calc服務(wù)器端的接口
#include "calc.nsmap"        // XML namespace mapping table (only needed once at the global level)
#include "soapcalcService.h" // the service class, also #includes "soapH.h" and "soapStub.h"
int main()
{
  calcService calc(SOAP_XML_INDENT);
  if (calc.serve() != SOAP_OK)
    calc.soap_stream_fault(std::cerr);
  calc.destroy(); // same as: soap_destroy(calc.soap);
  soap_end(calc.soap);
}
int calcService::add(double a, double b, double &result)
{
  result = a + b;
  return SOAP_OK;
}
int calcService::sub(double a, double b, double &result)
{
  result = a - b;
  return SOAP_OK;
}
int calcService::mul(double a, double b, double &result)
{
  result = a * b;
  return SOAP_OK;
}
int calcService::div(double a, double b, double &result)
{
  if (b == 0.0)
  {
    char *msg = (char*)soap_malloc(this->soap, 1024);
    snprintf(msg, 1024, "Trying to divide %f by zero", a);
    return this->soap_senderfault(msg, NULL);
  }
  result = a / b;
  return SOAP_OK;
}
int calcService::pow(double a, double b, double &result)
{
  result = ::pow(a, b);
  // soap_errno is like errno, but compatible with Win32
  if (soap_errno == EDOM)
  {
    char *msg = (char*)soap_malloc(this->soap, 1024);
    snprintf(msg, 1024, "<error xmlns=\"http://tempuri.org/\">Can't take power of %f to %f</error>", a, b);
    return this->soap_senderfault("Power function domain error", msg);
  }
  return SOAP_OK;
}
  1. 編譯谈秫,測試
c++ -o calcserver calcserver.cpp soapC.cpp soapcalcService.cpp -lgsoap++
./calcserver < calc.add.req.xml

這時候calcserver是一個cgi程序扒寄,從標(biāo)準(zhǔn)輸入讀取soap命令,輸出到標(biāo)準(zhǔn)輸出上拟烫。接下來搭建一個webserver來提供cgi服務(wù)该编。

1.2.2 搭建cgi服務(wù)器

簡單起見,使用docker啟動一個apache來作為web server硕淑。

  1. 下載apache鏡像
docker pull httpd:2.4
  1. 修改http.conf文件课竣,啟動apache對cgi的支持嘉赎。
    取得http.conf文件,修改其中的cgi支持稠氮,打開下面內(nèi)容的注釋即可
LoadModule cgi_module modules/mod_cgi.so
  • http.conf在docker container的路徑為:/usr/local/apache2/conf/httpd.conf
  • 這步不做的話曹阔,運行client的時候半开,會提示如下錯誤隔披,即apache把cgi請求當(dāng)成了下載文件的請求。
Error 200 fault: SOAP-ENV:Client[no subcode]
"Error 200"
Detail: [no detail]
  1. 啟動服務(wù),在calcserverhttp.conf所在目錄輸入如下命令:
docker run -it --rm --name my-apache-app -p 9999:80 -v "$PWD":/usr/local/apache2/cgi-bin -v "$PWD"/http.conf:/usr/local/apache2/conf/httpd.conf -v /usr/lib/x86_64-linux-gnu/libgsoap++.so.4:/usr/lib/x86_64-linux-gnu/libgsoap++.so.4 httpd:2.4

1.3 其他

1.3.1 問題

gsoap也支持自己作為web服務(wù)器提供服務(wù)寂拆,只需要修改server代碼奢米,即可,但我沒有試驗成功纠永。

int main()
{
  calcService calc(SOAP_XML_INDENT);
  //if (calc.serve() != SOAP_OK) <--這里改為調(diào)用run
  if (calc.run(9999) != SOAP_OK)
    calc.soap_stream_fault(std::cerr);
  calc.destroy(); // same as: soap_destroy(calc.soap);
  soap_end(calc.soap);
}

這時運行服務(wù)器程序時始終提示:

setsockopt unset IPV6_V6ONLY failed in soap_bind()

1.3.2 curl調(diào)試webservice服務(wù)器

可以使用curl模擬客戶端請求一個soap服務(wù)[4]鬓长,命令如下:

curl -v --header "content-type: application/soap+xml"  --data @calc.add.req.xml localhost:9999/cgi-bin/calcserver.cgi

2 編譯arm-linux版本的gsoap

2.1 下載gsoap源碼

http://liquidtelecom.dl.sourceforge.net/project/gsoap2/gSOAP/gsoap_2.8.33.zip

2.2 配置編譯環(huán)境

  1. 下載linaro toolchain,解壓到目錄/usr/local/linaro-multilib-2014.06-gcc4.9
  2. 設(shè)置PATH環(huán)境變量尝江。export PATH=/usr/local/linaro-multilib-2014.06-gcc4.9:$PATH

2.3 config&make

2.3.1 生成makefile

gsoap-2.8$ ./configure --host=arm-linux-gnueabihf --prefix=/usr/local/arm-linux
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for arm-linux-gnueabihf-strip... arm-linux-gnueabihf-strip
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking build system type... x86_64-unknown-linux-gnu
checking host system type... arm-unknown-linux-gnueabihf
checking whether make sets $(MAKE)... (cached) yes
checking for arm-linux-gnueabihf-g++... arm-linux-gnueabihf-g++
checking whether the C++ compiler works... yes
checking for C++ compiler default output file name... a.out
checking for suffix of executables... 
checking whether we are cross compiling... yes
...
  • --host=arm-linux-gnueabihf - 表明編譯的庫是運行在arm linux上涉波,這個也是gcc編譯器的前綴。
  • --prefix=/usr/local/arm-linux - 表明變編譯好的庫的安裝路徑

2.3.2 手動生成wsdl.h文件

gsoap-2.8$ cd gsoap/wsdl
gsoap-2.8/gsoap/wsdl$ ../../target-amd64/bin/soapcpp2 -SC -pwsdl -I. -I../../gsoap/import ./wsdl.h

**  The gSOAP code generator for C and C++, soapcpp2 release 2.8.33
**  Copyright (C) 2000-2016, Robert van Engelen, Genivia Inc.
**  All Rights Reserved. This product is provided "as is", without any warranty.
**  The soapcpp2 tool and its generated software are released under the GPL.
**  ----------------------------------------------------------------------------
**  A commercial use license is available from Genivia Inc., contact@genivia.com
**  ----------------------------------------------------------------------------

soapcpp2: using both options -C and -S omits client/server code
Saving wsdlStub.h annotated copy of the source interface file
Saving wsdlH.h serialization functions to #include in projects
Saving xmime.nsmap namespace mapping table
Saving wsdlC.cpp serialization functions

Compilation successful 

../../target-amd64/bin/soapcpp2這個是你的host機(jī)器可以運行的soapcpp2

如果不做這步炭序,在編譯過程中會提示如下錯誤啤覆,因為編譯時,生成的soapcpp2是只能在arm linux上運行的惭聂。

make[4]: Entering directory `/home/meng/git/gsoap-2.8/gsoap/wsdl'
../../gsoap/src/soapcpp2 -SC -pwsdl -I. -I../../gsoap/import ./wsdl.h
/bin/bash: ../../gsoap/src/soapcpp2: cannot execute binary file: Exec format error
make[4]: *** [wsdlC.cpp] Error 126

2.3.3 修改代碼

修改config.h文件窗声,刪除最后一行的#define malloc rpl_malloc
否則編譯會出錯
`

2.3.4 修改makefile

修改gsoap/wsdl目錄下的Makefile,刪除下面2行(因為wsdl2h對其他庫有依賴辜纲,并且我們也不需要arm版本的wsdl2h程序):

wsdl2h$(EXEEXT): $(wsdl2h_OBJECTS) $(wsdl2h_DEPENDENCIES) $(EXTRA_wsdl2h_DEPENDENCIES) 
    #@rm -f wsdl2h$(EXEEXT)
    #$(AM_V_CXXLD)$(wsdl2h_LINK) $(wsdl2h_OBJECTS) $(wsdl2h_LDADD) $(LIBS)

2.3.5 編譯笨觅,安裝

gsoap-2.8$ make
gsoap-2.8$ make install

在目錄/usr/local/arm-linux下是編譯好的gsoap庫,注:我們沒有編譯出來arm linux版本的wadl2h耕腾。

2.4 編譯arm-linux版calcserver.cgi

  • 編譯cgi版本的calcserver.cgi
calcserver$ arm-linux-gnueabihf-g++ -o calcserver.cgi calcserver.cpp soapC.cpp soapcalcService.cpp -lgsoap++ -DWITH_FASTCGI -L/usr/local/arm-linux/lib -I/usr/local/arm-linux/include
  • 編譯支持fastcgi版本的calcserver.cgi[5]
calcserver$ arm-linux-gnueabihf-g++ -o calcserver.cgi calcserver.cpp soapC.cpp soapcalcService.cpp /gsoap-source-path/gsoap/stdsoap2.cpp -DWITH_FASTCGI  -I/usr/local/arm-linux/include -I/fcgi-lib-path/fcgi/include -L/fcgi-lib-path/fcgi/usr/lib -lfcgi
  • fcgi-lib-path - 這個指向arm linux版的fcgi庫
  • gsoap-source-path - 這個指向gsoap的源碼路徑`
  • 我們編譯stdsoap2.cpp這個文件见剩,而不去鏈接libsoap++.a
  • 定義WITH_FASTCGI

2.5 配置lighttpd

如果編譯的是cgi版本,直接把編譯好的calcserver.cgi放到cig-bin目錄下即可扫俺。

如果是fastcgi版本苍苞,需要修改lighttpd配置文件,增加如下內(nèi)容(前提lighttpd已經(jīng)配置好支持fastcgi了):

fastcgi.server = (
  "calcserver.cgi" =>
  (( "socket" => "/tmp/fcgi.socket",
     "check-local" => "disable",
     "bin-path" => "/webSvr/web/cgi-bin/calcserver.cgi",
     "max-procs" => 1,
  ))
)

3 參考文檔

  1. Apache Tutorial: Dynamic Content with CGI
  2. Getting Started with gSOAP
  3. gSoap missing stdsoap2.cpp, undefined reference to `soap_peek_element'
  4. Curl實現(xiàn)web serivce調(diào)試調(diào)用
  5. 19.32 FastCGI Support - genivia.com
  6. linux設(shè)備上的Onvif 實現(xiàn)4:成功編譯gsoap 2.8.15 - blog.csdn
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末牵舵,一起剝皮案震驚了整個濱河市柒啤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌畸颅,老刑警劉巖担巩,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異没炒,居然都是意外死亡涛癌,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拳话,“玉大人先匪,你說我怎么就攤上這事∑埽” “怎么了呀非?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長镜盯。 經(jīng)常有香客問我岸裙,道長,這世上最難降的妖魔是什么速缆? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任降允,我火速辦了婚禮,結(jié)果婚禮上艺糜,老公的妹妹穿的比我還像新娘剧董。我一直安慰自己,他們只是感情好破停,可當(dāng)我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布翅楼。 她就那樣靜靜地躺著,像睡著了一般辱挥。 火紅的嫁衣襯著肌膚如雪犁嗅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天晤碘,我揣著相機(jī)與錄音褂微,去河邊找鬼。 笑死园爷,一個胖子當(dāng)著我的面吹牛宠蚂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播童社,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼求厕,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了扰楼?” 一聲冷哼從身側(cè)響起呀癣,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎弦赖,沒想到半個月后项栏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡蹬竖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年沼沈,在試婚紗的時候發(fā)現(xiàn)自己被綠了流酬。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡列另,死狀恐怖芽腾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情页衙,我是刑警寧澤摊滔,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站拷姿,受9級特大地震影響惭载,放射性物質(zhì)發(fā)生泄漏旱函。R本人自食惡果不足惜响巢,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望棒妨。 院中可真熱鬧踪古,春花似錦、人聲如沸券腔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽纷纫。三九已至枕扫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間辱魁,已是汗流浹背烟瞧。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留染簇,地道東北人参滴。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像锻弓,于是被迫代替她去往敵國和親砾赔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容