將他解壓後,進入到文件夾:gsoap_2.8.18\gsoap-2.8\gsoap\bin\win32html
裏面有2個咱們要用到的exe,wsdl2h.exe和soapcpp2.exe,若是缺乏一個typemap.dat,則從gsoap_2.8.18\gsoap-2.8\gsoap下拷貝進來,最後就能夠啓用cmd,開始生成WebService了web
個人作法是拷貝一個cmd的快捷方式進來,而後右鍵屬性,把它的「起始位置」設置爲F:\webSite\gsoap_2.8.18\gsoap-2.8\gsoap\bin\win32,應用後啓動此快捷方式,那麼操做目錄就爲當前目錄了。利用wsdl2h.exe,使用cmd生成WebService的頭文件以下:服務器
wsdl2h -o 頭文件名 WSDL文件名或URLsocket
說明:(注意大小寫)函數
-o 文件名,指定輸出頭文件名測試
-n 命名空間前綴 代替默認的ns編碼
-c 產生純C代碼,不然是C++代碼.net
-s 不要使用STL代碼命令行
-t 文件名,指定type map文件,默認爲typemap.datxml
-e 禁止爲enum成員加上命名空間前綴
這裏我生成一個foxwelltech.h頭文件,不使用STL,結果以下:
生成的foxwelltech.h就包含了全部預先寫好的WebService函數接口。從cmd中能夠看到該命令須要用到typemap.dat文件,因此若是沒有該文件,會提示找不到文件,須要從別處拷貝過來。接下來,咱們按照cmd最後的提示,進行下一步,用soapcpp2.exe來生成可用的.h和.cpp文件:
soapcpp2經常使用選項:(注意大小寫)
-C 僅生成客戶端代碼
-S 僅生成服務器端代碼
-L 不要產生soapClientLib.c和soapServerLib.c文件
-c 產生純C代碼,不然是C++代碼(與頭文件有關)
-I 指定import路徑(見上文)
-x 不要產生XML示例文件
-i 生成C++包裝,客戶端爲xxxxProxy.h(.cpp),服務器端爲xxxxService.h(.cpp)
若是報錯:Critical error: #import: Cannot open file "stlvector.h"for reading.
Hint: use option -I<path> (you candefine multiple paths separated with ';')
則要使用-I選項指定gSOAP的 import文件路徑
我使用的命令行是:
soapcpp2 -C -x foxwelltech.h -IF:\Website\gsoap_2.8.18\gsoap-2.8\gsoap\import
意爲根據foxwelltech.h只生成客戶端代碼,不生成無用的xml文件,另外要引用一個import文件夾,結果以下:
最後的Compilation successful說明了一切,結果就是生成了一個nsmap命名空間文件,二個.h文件,三個.cpp文件
最後,咱們新建一個C++的控制檯工程來使用它們
注意:
1. 第一步生成的foxwelltech.h不用加進來,直接使用由它生成的後續.h和.cpp便可
2. stdsoap2.h和stdsoap2.cpp來自於路徑:F:\Website\gsoap_2.8.18\gsoap-2.8\gsoap
3. 除nsmap文件外,其餘6個都要添加到工程裏面編譯,而後添加測試代碼
工程截圖:
運行結果截圖:
能夠看到返回的UserLoginResult爲{"MSG_CODE":1,"MSG_INFO":""},這是我這個項目約定的通信格式,MSG_CODE爲1表明成功,意爲這裏的登錄測試代碼運行結果爲登錄成功,同理,修改代碼將用戶名密碼設爲空再登錄,則運行結果爲:
這樣則爲登錄失敗
1. 使用WebService所調用的函數到一開始生成的foxwelltech.h中查找,再在函數名前加上soap_call_便可。如在foxwelltech.h中找到了登錄函數__tempuri__UserLogin,再加上前綴後變成了soap_call___tempuri__UserLogin_(好像後面還多了一個下劃線),發現這個函數是在soapClient.cpp中實現的,因此也驗證了以前說的,不須要在工程中添加foxwelltech.h
2. 若是在vc中開發的話,引入的3個cpp文件要進行設置不使用預編譯頭文件,方法:工程 -》設置 -》選擇cpp文件 -》預編譯頭 -》選擇不使用。另外一方面,soap也是使用socket通訊的因此連接的時候還要加上wsock32.lib,方法:工程-》設置-》連接在後面加上wsock32.lib便可
3. nsmap命名空間文件最好是用#include寫在stdafx.h文件中
4. gsoap的核心內部入和出都是UTF8編碼的,因爲中文是多字節的,因此將多字節的按照UTF8轉換,最終結果就是亂碼。正確的方式應該是:soap_set_mode(&soap,SOAP_C_MBSTRING);這樣中文便不會亂碼,可正常返回
5. 參考連接:
http://yangzb.iteye.com/blog/422463
http://blog.csdn.net/shaoyuan1943/article/details/8184341
http://blog.sina.com.cn/s/blog_4900f3fb0100j94p.html
http://blog.csdn.net/dingxz105090/article/details/40043959