gSoap工具wsdl2h及soapcpp2指令匯總


  gSoap開發包的下載地址http://sourceforge.net/projects/gsoap2,在bin目錄下提供了兩個工具:

  1:wsdl2h:The gSOAP wsdl2h tool imports one or more WSDLs and XML schemas and generates a gSOAP header le with familiar C/C++ syntax to de fine the Web service operations and the C/C++ data types.利用WSDL和XML schemas生成包含WS屬性和操作的C++風格gSoap頭文件。

  2:The gSOAP soapcpp2 compiler then takes this header fi le and generates XML serializers for the data types (soapH.h and soapC.cpp), the client-side stubs (soapClient.cpp), and server-side skeletons (soapServer.cpp).編譯頭文件並生成xml等文件。其中,soapH.h and soapC.cpp包含了數據類型的描述,soapClient.cpp給客戶端使用,soapServer.cpp給服務端使用。

  通過官方給出的介紹可知,wsdl2h用作wsdl和.h文件的轉換。soapcpp2用頭文件生成客戶端/服務端等開發需要的h和cpp文件。下面是官方給出的一個例子:

wsdl2h -o calc.h http://www.genivia.com/calc.wsdl
soapcpp2 -i -C calc.h

 

  我下載是gSoap2.8.14,經過整理文檔,wsdl2h和soapcpp的可選指令如下:

  1:wsdl2h指令匯總

  經常使用的一些指令如下:

  -o filename.h   將wsdl轉化為filename.h頭文件。

  -s         不生成STL代碼

  -c         生成純C風格的頭文件,這將去除C++的一些特性

  -n  name      使用name代替默認前綴ns

  -t filename.dat  使用filename.dat代替默認的typemap.dat文件

  -zX        兼容之前的X版本

  2:soapcpp2

  經常使用的一些指令如下:

  -i     生成server的proxy和object,這種object繼承於soap struct。

  -j     和-i類似,區別在於生成的代理類不繼承於soap struct,而是包含了包含了一個soap結構的指針。此種方式生存的代理類便於互相通信

  -C    僅生成客戶端client代碼

  -S    僅生成服務端server代碼

  -x    不生成xml文件。不用此項的話,將對頭文件中定義的每個operation生成一個描述性的xml文件

  -L    不生成soapClientLib文件和soapServerLib文件

  -p name  修改文件名前綴,代替soap

  -q name  指定代理類和對象使用的名空間name,包含文件名前綴

  3:soapcpp2生成的各文件釋義

轉自:https://www.cnblogs.com/hgwang/p/5840265.html

 

gSOAP是一個綁定SOAP/XML到C/C++語言的工具,使用它可以簡單快速地開發出SOAP/XML的服務器端和客戶端。由於 gSOAP具 有相當不錯的兼容性,通過gSOAP,我們就可以調用由Java, .Net, Delhpi, PHP等語言開發的SOAP服務,或者向它們提供SOAP服務。

gSOAP的主頁是:

http://sourceforge.net/projects/gsoap2

下載解壓后,可以在gsoap\bin\win32里 找到wsdl2h.exe和soapcpp2.exe(另外還有linux和mac版本)。

  • wsdl2h.exe的作用是根據WSDL生成C/C++風格的頭 文件
  • soapcpp2.exe的作用是根據頭文件自動生成調用遠程 SOAP服務的客戶端代碼(稱為存根:Stub)和提供SOAP服務的框架代碼(稱為框架:Skeleton),另外它也能從頭文件生成WSDL文件。

gsoap\stdsoap2.cpp則是gSOAP的核心代碼,要使用 gSOAP只要在項目里包含這個文件以及由soapcpp2.exe生成的代碼即可。另外還有個stdsoap2.c,內容與stdsoap2.cpp一 模一樣,用於純C項目。

gSOAP兩大工具的用法

從WSDL中產生頭文件

用法:

wsdl2h -o 頭文件名 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里寫

xsd__string = | std::wstring | wchar_t*

那么SOAP/XML中的string將轉換成std::wstring或wchar_t*,這樣能更好地支持中文。

例:

wsdl2h -o ayandy.h \
-n ay -t wsmap.dat \
http://www.ayandy.com/Service.asmx?WSDL

http://www.ayandy.com/Service.asmx?WSDL 生成ayandy.h文件,名空間為ay,使用wsmap.dat指定的轉換規則。

wsdl2h生成的頭文件里的變量、類型等名稱的前面都會加上名空間前綴,以兩個下划線分隔。如上面的命令生成的頭文件,有這樣的定 義:

  1. class ay1__ArrayOfString;
  2. enum ay1__theDayFlagEnum
  3. {
  4.  ay1__theDayFlagEnum__Today,
  5.  ay1__theDayFlagEnum__Tomorrow,
  6.  ay1__theDayFlagEnum__theDayafterTomorrow,
  7. };

前面的ayandy1__的是名空間前綴,用以防止名稱沖突。 wsdl2h的-n選項可以改變這個名空間前綴(默認為ns)。對於枚舉ay1__theDayFlagEnum內 的成員,如果嫌它太長的話,可以用-e命令選項禁止加入名空間前綴。

從頭文件生成存根(stub)和框架(Skeleton)源文件

編寫SOAP程序除了頭文件是不夠的,還要有連接、通信、XML解析、序列/反序列化等工作。gSOAP提供的socapcpp2.exe就 是用於從頭文件中生成這些代碼的,我們只要關心真正的業務邏輯就行了。

用法

soapcpp2 頭文件

例:

soapcpp2 ayandy.h

將生成下面這些文件

  • soapStub.h    // soap的存根文件,定義了ayandy.h里對應的遠程調用模型
  • soapC.c soapH.h  // soap的序列和反序列代碼,它已經包含了soapStub.h,服務器端與客戶端都要包含它
  • soapClient.c soapClientLib.c // 客戶端代碼,soapClientLib.c文件則只是簡單地包含soapClient.c和soapC.c
  • soapServer.c soapServerLib.c // 服務器端代碼,soapServerLib.c文件則只是簡單地包含soapServer.c和soapC.c
  • ServiceSoap.nsmap ServiceSoap12.nsmap // 名空間定義,服務器端與客戶端都要包含它
  • soapServiceSoapProxy.h soapServiceSoap12Proxy.h // 客戶端的C++簡單包裝(如果頭文件是純C代碼,這兩個文件就不會生成)

綜上所述

  • 如果編寫服務器端,項目里應該加入soapServerLib.c,代碼里包含頭文件soapH.h
  • 如果編寫客戶端,項目里應該加入soapClientLib.c,代碼里包含頭文件SoapH.h(或xxxxProxy.h)
  • 當然,還要加入gsoap庫里的stdsoap2.cpp文件(如果是寫C代碼,則加入stdsoap2.c)

如果看到soapcpp2提示:”Critical error: #import: Cannot open file "stlvector.h" for reading.“, 那是因為我們的頭文件使用了STL(wsdl2h 沒用-s選項),這時要使用-I選項指定gSOAP的 import文件路徑,這個路徑是"$gsoap\gsoap\import":

soapcpp2 ayandy.h -I D:\gsoap-2.7\gsoap\import

soapcpp2常用選項

  • -C 僅生成客戶端代碼
  • -S 僅生成服務器端代碼
  • -L 不要產生soapClientLib.c和soapServerLib.c文件
  • -c 產生純C代碼,否則是C++代碼(與頭文件有關)
  • -I 指定import路徑(見上文)
  • -x 不要產生XML示例文件
  • -i 生成C++包裝,客戶端為xxxxProxy.h(.cpp),服務器端為xxxxService.h(.cpp)。

轉自:https://www.oschina.net/question/10320_7573


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM