天天看點

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