天天看點

c++調用webservice接口的幾種方法以及執行個體c++調用webservice接口的幾種方法以及執行個體

c++調用webservice接口的幾種方法以及執行個體

前言

最近在做這方面的工作,過程中遇到一些問題,故在此整理并分享一下,讓後來者少走一些彎路.廢話不多說,直接上幹貨.

準備工具:sproxy.exe/wsdl.exe;gsoap.均存在我的網盤中(還有一些其他好東西),大家自行伸手.(提取碼:oJyA)

c++調用webservice的幾種方法

目前,常用的調用方法有三種(個人知識有限,歡迎提點),本文中主要介紹第一和第三種方法:

  1. 使用sproxy.exe生成頭檔案,此種方法最簡單,直接加載到項目中調用即可;
  2. 使用wsdl.exe生成頭檔案,加載到項目中調用,與第一點同理,但未嘗試,有空再回來補充;
  3. 使用gsoap生成檔案,把生成的相關檔案均加載到項目中調用(此方法較第一點比較麻煩);

關于webservice的準備工作

首先你得有webservice位址,然後你才能夠調用.

網上有很多公共的webservice接口,這裡用其中一個"國内手機号碼歸屬地查詢WEB服務"來舉個栗子.

一般的接口是這樣的: http://www.webxml.com.cn/WebServices/MobileCodeWS.asmx

第一步,添加字尾

添加字尾 ?wsdl 得到如下網址:

http://www.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl

打開是這樣,說明成功

c++調用webservice接口的幾種方法以及執行個體c++調用webservice接口的幾種方法以及執行個體

第二步,儲存檔案

把網頁上的這些檔案另存為wsdl格式的檔案,右鍵->另存為即可下載下傳.

c++調用webservice接口的幾種方法以及執行個體c++調用webservice接口的幾種方法以及執行個體

下載下傳完成.

方法一:使用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檔案.

c++調用webservice接口的幾種方法以及執行個體c++調用webservice接口的幾種方法以及執行個體

2.使用接口執行個體

觀察一下生成的.h中要使用的接口:

c++調用webservice接口的幾種方法以及執行個體c++調用webservice接口的幾種方法以及執行個體

有三個參數,最後一個參數是傳回的結果.

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)。

c++調用webservice接口的幾種方法以及執行個體c++調用webservice接口的幾種方法以及執行個體

執行成功後會生成紅框中的檔案

c++調用webservice接口的幾種方法以及執行個體c++調用webservice接口的幾種方法以及執行個體

3.使用執行個體

1.加載入項目中

把上圖紅框中的五個檔案(除了soapClientLib.cpp),以及gsoap下的stdsoap2.h和stdsoap2.cpp兩個檔案添加到項目中.

在項目中添加這七個檔案後,cpp檔案需要修改屬性:在項目中的cpp上右鍵屬性,選擇不使用預編譯頭.

c++調用webservice接口的幾種方法以及執行個體c++調用webservice接口的幾種方法以及執行個體

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");
}  
           
c++

繼續閱讀