如何在C++中使用WebService


gsoap主頁

 

使用gsoap生成所需的WebService

下載后的gsoap包為: ( 點擊到我的資源中下載)

將他解壓后,進入到文件夾: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


免責聲明!

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



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