gsoap協議使用

一. 按照原來預研究的結果,使用gsoap的方法如下:

  1. wsdl2h.exe -o weather.hhttp://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsd生成

    weather.h文件。

  2. 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:

    http://blog.csdn.net/liujunpen/article/details/40353489

    http://www.cnblogs.com/virtorld/archive/2012/11/16/2773395.html

    http://developer.51cto.com/art/200908/147125.htm

二. 以上步驟我本地測試網上公開的天氣接口,證明是可用的,後面第三方接口提供了,我安裝以上方法去使用第三方的webservice接口,發現一些問題:

  1. 編譯的時候出現找不到"stdafx.h"

    解決:通過在響應的.cpp中最開始添加#include "stdafx.h",修復該編譯錯誤

  2. 編譯時遇到 stdsoap2.obj : error LNK2001: 無法解析的外部符號_namespaces

    解決: stdsoap2.h,添加

      #ifndef WITH_NONAMESPACES

      #define WITH_NONAMESPACES

      #endif

    參考:http://www.cnblogs.com/hangj/p/3620406.html

三. 以上問題解決後,又遇到一個更奇葩的問題,因爲要調用第三方的二個接口,但是這二個接口確實二個不同的webservice,最開始我採取了比較普通的方法,按照gsoap的方法分別操作了二次,並且把這二次生成的文件放在了二個目錄中,在工程中也是按照這樣的結構添加文件,但是

  1. 編譯的時候出問題"error C2374: “namespaces”: 重定義;多次初始化 gsoap",首先我就是谷歌了,按照一些搜索到的方法去做了,發現還是不行,造成這個問題的原因是因爲使用多個webservice,每個.nsmap中都會定義struct Namespace,造成了重定義,怎麼辦呢?

    解決: 後面找了些文章,發現我們可以將多個wsdl文件統一生成爲一個頭文件,然後再用這個統一的頭文件來生成gsoap代碼則不會有衝突問題了(解救了我啊),方式是:

    wsdl2h -o file.h file1.wsdl file2.wsdl file3.wsdl‘

  2. 然後在執行【一】中的【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了。

3.改了之後再測試,發現一直返回12錯誤,崩潰~~~,網上找了好多,也沒發現是什麼問題。

  1. 爲了解決問題,繼續找啊,發現一個blog:http://blog.csdn.net/huys03/article/details/17174763,

    發現這個博主使用的是代理類的形式,我想反正我那條路已經斷了,要不也參照下這個blog試一下吧,說幹就幹,參照這,把gsoap的操作改成一下方式了:

  2. wsdl2h.exe -v -o test.h WebService1.wsd WebService2.wsd

  3. 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使用webservice的全部過程,記錄下來,方便自己以後查閱,也希望對遇到同樣問題的你,有所幫助。

以上有參考一下wiki:

http://blog.csdn.net/nodeathphoenix/article/details/7736307

http://blog.csdn.net/huys03/article/details/17174763

http://blog.163.com/zhangliye_2009/blog/static/1223120282013021111543559

 

window標準版執行命令:

1. wsdl2h.exe -v -o test.h CommonService.wsdl WeC hatService.wsdl QueryInterface.wsdl ThirdPartyService.wsdl

2. soapcpp2.exe -1 -C -j -I E:\temp\gsoap-2.8\gsoap\import test.h

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章