c++調用webservice接口的幾種方法以及執行個體
前言
最近在做這方面的工作,過程中遇到一些問題,故在此整理并分享一下,讓後來者少走一些彎路.廢話不多說,直接上幹貨.
準備工具:sproxy.exe/wsdl.exe;gsoap.均存在我的網盤中(還有一些其他好東西),大家自行伸手.(提取碼:oJyA)
c++調用webservice的幾種方法
目前,常用的調用方法有三種(個人知識有限,歡迎提點),本文中主要介紹第一和第三種方法:
- 使用sproxy.exe生成頭檔案,此種方法最簡單,直接加載到項目中調用即可;
- 使用wsdl.exe生成頭檔案,加載到項目中調用,與第一點同理,但未嘗試,有空再回來補充;
- 使用gsoap生成檔案,把生成的相關檔案均加載到項目中調用(此方法較第一點比較麻煩);
關于webservice的準備工作
首先你得有webservice位址,然後你才能夠調用.
網上有很多公共的webservice接口,這裡用其中一個"國内手機号碼歸屬地查詢WEB服務"來舉個栗子.
一般的接口是這樣的: http://www.webxml.com.cn/WebServices/MobileCodeWS.asmx
第一步,添加字尾
添加字尾 ?wsdl 得到如下網址:
http://www.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl
打開是這樣,說明成功

第二步,儲存檔案
把網頁上的這些檔案另存為wsdl格式的檔案,右鍵->另存為即可下載下傳.
下載下傳完成.
方法一:使用sproxy.exe生成頭檔案并使用
1.生成頭檔案
sproxy使用方法: sproxy.exe /wsdl /out:“生成頭檔案目錄名稱” “生成的wsdl檔案的路徑”
eg:我的檔案放在F:\webservice.WSDL轉換成C轉換成C++代碼中,使用cmd進入此檔案夾,并輸入指令:
F:\webservice.WSDL轉換成C轉換成C++代碼> .\sproxy.exe /wsdl /out:"F:\webservice.WSDL轉換成C轉換成C++代碼\MobileCodeWS.h" "F:\webservice.WSDL轉換成C轉換成C++代碼\MobileCodeWS.wsdl"
- 1
執行完成後,會生成MobileCodeWS.h檔案.
2.使用接口執行個體
觀察一下生成的.h中要使用的接口:
有三個參數,最後一個參數是傳回的結果.
1.首先添加頭檔案以及使用命名空間
#include "MobileCodeWS.h"
using namespace MobileCodeWS;
- 1
- 2
2.執行個體化
CMobileCodeWS *oMobileWS = new CMobileCodeWS;
- 1
3調用以及傳參
int iRet = oMobileWS->getMobileCodeInfo((CComBSTR)"15481348245",(CComBSTR)"",&bsRet);
- 1
4轉換
//BSTR轉換方法使用_com_util::ConvertBSTRToString(bsRet)
- 1
注意:
- CComBSTR頭檔案:<comdef.h>
- 使用_com_util::ConvertBSTRToString需添加#pragma comment(lib, “comsuppw.lib”)
方法二:使用wsdl.exe
這個方法可能适合c#使用,c++未嘗試,待更.
使用方法類似方法一,自行研究.
方法三:使用gsoap.exe生成檔案
由于未知原因,在使用第一種方法時,第一步生成頭檔案就失敗,無法解析wadl的内容,報error.是以本人在網上搜羅大牛的部落格查詢資料借鑒整理驗證,集前人所得才可最終成功.此方法稍微複雜一點點點點,各位看官請耐心.
1.使用wsdl2生成頭檔案
注意:
如果說傳輸的内容中含有中文,則需要增加一個bat檔案,把傳輸類型由std::string轉為wchar_t*,由寬字元傳輸,則可以解決亂碼問題.剛開始由于沒有添加處理檔案導緻後續接收到的中文亂碼,折騰了半天,希望大家少走彎路.
bat檔案(用txt文本儲存如下檔案,再修改字尾為bat即可)中一句話:
xsd__string = | std::wstring | wchar_t*
在gsoap-2.8\gsoap\bin\win32目錄下,首先使用wsdl2.exe生成頭檔案:
F:\gsoap-2.8\gsoap\bin\win32> .\wsdl2h.exe -o .\MobileCodeWS.h .\MobileCodeWS.wsdl
或者不生成wsdl檔案,直接使用wsdl的網址也可以生成
F:\gsoap-2.8\gsoap\bin\win32> .\wsdl2h.exe -o .\MobileCodeWS.h http://www.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl
添加bat項:
F:\gsoap-2.8\gsoap\bin\win32> .\wsdl2h.exe -o .\MobileCodeWS.h .\MobileCodeWS.wsdl -t chinano1.bat
- 1
- 2
- 3
- 4
- 5
2.使用soapcpp2生成系列檔案
PS F:\gsoap-2.8\gsoap\bin\win32> .\soapcpp2.exe -C .\MobileCodeWS.h -I F:\gsoap-2.8\gsoap\import -x
- 1
soapcpp2常用選項
-C 僅生成用戶端代碼
-S 僅生成伺服器端代碼
-L 不要産生soapClientLib.c和soapServerLib.c檔案
-c 産生純C代碼,否則是C++代碼(與頭檔案有關)
-I 指定import路徑
-x 不要産生XML示例檔案
-i 生成C++包裝,用戶端為xxxxProxy.h(.cpp),伺服器端為xxxxService.h(.cpp)。
執行成功後會生成紅框中的檔案
3.使用執行個體
1.加載入項目中
把上圖紅框中的五個檔案(除了soapClientLib.cpp),以及gsoap下的stdsoap2.h和stdsoap2.cpp兩個檔案添加到項目中.
在項目中添加這七個檔案後,cpp檔案需要修改屬性:在項目中的cpp上右鍵屬性,選擇不使用預編譯頭.
2.調用流程
首先需要添加頭檔案:
#include “soapH.h”
#include “MobileCodeWSSoap.nsmap”
執行個體如下:
#include "stdafx.h"
#include <iostream>
#include "soapH.h"
#include "MobileCodeWSSoap.nsmap"
#include <fstream>
using namespace std;
int main ()
{
// SOAP的用戶端
struct soap m_oSoap;
// WebService調用對象
class _ns1__getMobileCodeInfo getMobileCodeObject;
// WebService傳回對象
class _ns1__getMobileCodeInfoResponse getMobileCodeResponseObject;
// SOAP初始化
soap_init(&m_oSoap);
// 調用函數的參數指派
char strName[24] = {0};
sprintf(strName,"15742451354");
wchar_t *wstrName = A2W(strName);
getMobileCodeObject.mobileCode = wstrName;
/*如果生成頭檔案時沒有修改類型,那麼用如下方式指派,接收的類型當然也是string:
std::string strName = "15742451354";
getMobileCodeObject.mobileCode = strName;
*/
// 發送WebService請求,并獲得傳回結果
int nResult = soap_call___ns1__getMobileCodeInfo(&m_oSoap,NULL,NULL,&getMobileCodeObject,getMobileCodeResponseObject);
// 操作成功
if(SOAP_OK == nResult)
{
// 輸出傳回結果
wchar_t* strResult = getMobileCodeResponseObject.getMobileCodeInfoResult;
wcout.imbue(locale("chs"));
wcout<<"wcout:"<<strResult<<endl;
}
/// 關閉SOAP
soap_destroy(&m_oSoap);
soap_end(&m_oSoap);
soap_done(&m_oSoap);
system("pause");
}