如何在C++中使用WebService

gsoap主頁

 

使用gsoap生成所需的WebService

下載後的gsoap包爲: ( 點擊到個人資源中下載)

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

相關文章
相關標籤/搜索