gsoap初始化释放_通过gsoap使用webservice
一. 按照原來預研究的結果,使用gsoap的方法如下:
soapcpp2.exe -C weather.h -I E:\temp\gsoap-2.8\gsoap\import(E:\temp\gsoap-2.8\gsoap\import是我本地的路徑),這樣可以生成C++文件(soapClient.cpp, soapH.h, soapStub.h, WeatherWebServiceSoap.nsmap),然后還需要stdsoap2.cpp和stdsoap2.h 2個文件,編譯的時候把這些文件加到工程中。調用的方法會在soapStub.h 頭文件中產生。
參照了以后幾個wiki:
二. 以上步驟我本地測試網上公開的天氣接口,證明是可用的,后面第三方接口提供了,我安裝以上方法去使用第三方的webservice接口,發現一些問題:
編譯的時候出現找不到"stdafx.h"
解決:通過在響應的.cpp中最開始添加#include "stdafx.h",修復該編譯錯誤
編譯時遇到 stdsoap2.obj : error LNK2001: 無法解析的外部符號_namespaces
解決: stdsoap2.h,添加
#ifndef WITH_NONAMESPACES #define WITH_NONAMESPACES #endif
三. 以上問題解決后,又遇到一個更奇葩的問題,因為要調用第三方的二個接口,但是這二個接口確實二個不同的webservice,最開始我采取了比較普通的方法,按照gsoap的方法分別操作了二次,并且把這二次生成的文件放在了二個目錄中,在工程中也是按照這樣的結構添加文件,但是
編譯的時候出問題"error C2374: “namespaces”: 重定義;多次初始化 gsoap",首先我就是谷歌了,按照一些搜索到的方法去做了,發現還是不行,造成這個問題的原因是因為使用多個webservice,每個.nsmap中都會定義struct Namespace,造成了重定義,怎么辦呢?
解決: 后面找了些文章,發現我們可以將多個wsdl文件統一生成為一個頭文件,然后再用這個統一的頭文件來生成gsoap代碼則不會有沖突問題了(解救了我啊),方式是:
wsdl2h -o file.h file1.wsdl file2.wsdl file3.wsdl‘
然后在執行【一】中的【2】,生成C++文件,這樣做了后,生成了C++文件,然后加到項目中,編譯,成功,小開心了一下,然后繼續去測試能否獲取到數據。測試的時候發現一直沒有獲取到數據,跟了下代碼,發現返回調用公共的接口返回415錯誤,谷歌了下,發現是因為service端只支持 soap 1.1,而gsoap生成客戶端代碼默認是1.2
解決: gsoap 的soapcpp2的參數 -1 為soap 1.1 -2為soap1.2,具體就是把【一】【2】中的soapcpp2.exe -C weather.h -I E:\temp\gsoap-2.8\gsoap\import改成soapcpp2.exe -1 -C weather.h -I E:\temp\gsoap-2.8\gsoap\import,這樣就支持soap1.1了。
改了之后再測試,發現一直返回12錯誤,崩潰~~~,網上找了好多,也沒發現是什么問題。
為了解決問題,繼續找啊,發現一個blog:gSoap編寫代碼訪問WCF服務,發現這個博主使用的是代理類的形式,我想反正我那條路已經斷了,要不也參照下這個blog試一下吧,說干就干,參照這,把gsoap的操作改成一下方式了:
wsdl2h.exe -v -o test.h WebService1.wsd WebService2.wsd
soapcpp2.exe -1 -C -j -I E:\temp\gsoap-2.8\gsoap\import test.h
然后把XXXProxy.cpp中的方法中的soap_endpoint的值改一下,為什么要改呢?因為默認gsoap會將所有的service的endpoint加在一起賦值給每個接口,這樣就會出現類似
soap_endpoint=
"http://10.32.4.20:8012/QueryInterface.asmxhttp://10.32.4.20:9988/CommonService.svc";
的形式,其實我們需要的是
soap_endpoint = "http://10.32.4.20:8012/QueryInterface.asmx";
所以需要手動去把有類似問題的都改一下,改好后再重新編譯,OK,都沒有問題,繼續測試,OMG,完美,可以正常訪問,心里終于舒坦了。
四. gsoap設置超時
修改gsoap自動生成的代碼才能進行超時設置(我這邊訪問web service的代碼都是gsoap工具自動生成.根據wsdl接口)
找到生成的soapwwwsdlBindingProxy.cpp文件
找到你要設置超時的那個調用服務器的方法
找到該方法代碼 struct soap *soap = this;
在該代碼下添加如下三行代碼(時間大小根據項目自行調整)
soap->recv_timeout = 2;//接受 (單位是秒)
soap->send_timeout = 2;//發送 (單位是秒)
soap->connect_timeout = 2;//連接(單位是秒)
--以上就是這次通過gsoap使用webservice的全部過程,記錄下來,方便自己以后查閱,也希望對遇到同樣問題的你,有所幫助。
以上有參考一下wiki:
gsoap之client端引用多個service時命名沖突
gsoap 調用 WCF 415 錯誤
總結
以上是生活随笔為你收集整理的gsoap初始化释放_通过gsoap使用webservice的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 幼儿园音乐教案与反思歌曲《春晓》
- 下一篇: 英雄联盟游戏名字824个