gsoap主頁
使用gsoap生成所需的WebService

將他解壓后,進入到文件夾:gsoap_2.8.18\gsoap-2.8\gsoap\bin\win32
里面有2個我們要用到的exe,wsdl2h.exe和soapcpp2.exe,如果缺少一個typemap.dat,則從gsoap_2.8.18\gsoap-2.8\gsoap下拷貝進來,最后就可以啟用cmd,開始生成WebService了
我的做法是拷貝一個cmd的快捷方式進來,然后右鍵屬性,把它的“起始位置”設置為F:\webSite\gsoap_2.8.18\gsoap-2.8\gsoap\bin\win32,應用后啟動此快捷方式,那么操作目錄就為當前目錄了。利用wsdl2h.exe,使用cmd生成WebService的頭文件如下:
wsdl2h -o 頭文件名 WSDL文件名或URL
說明:(注意大小寫)
-o 文件名,指定輸出頭文件名
-n 命名空間前綴 代替默認的ns
-c 產生純C代碼,否則是C++代碼
-s 不要使用STL代碼
-t 文件名,指定type map文件,默認為typemap.dat
-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