通过gsoap使用webservice

一. 按照原来预研究的结果,使用gsoap的方法如下:

  1. wsdl2h.exe -o weather.h http://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:

c++ 通过 gsoap实现 webservice(附带天气实现的例子)
C++访问WebService(gSoap方式和com组件方式)
C++访问WebService(gSoap方式和com组件方式)

二. 以上步骤我本地测试网上公开的天气接口,证明是可用的,后面第三方接口提供了,我安装以上方法去使用第三方的webservice接口,发现一些问题:

  1. 编译的时候出现找不到"stdafx.h"
    解决:通过在响应的.cpp中最开始添加#include "stdafx.h",修复该编译错误
  2. 编译时遇到 stdsoap2.obj : error LNK2001: 无法解析的外部符号_namespaces
    解决: stdsoap2.h,添加
      #ifndef WITH_NONAMESPACES    #define WITH_NONAMESPACES    #endif

webservice gsoap 小记

三. 以上问题解决后,又遇到一个更奇葩的问题,因为要调用第三方的二个接口,但是这二个接口确实二个不同的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错误,崩溃~~~,网上找了好多,也没发现是什么问题。

  4. 为了解决问题,继续找啊,发现一个blog:gSoap编写代码访问WCF服务,发现这个博主使用的是代理类的形式,我想反正我那条路已经断了,要不也参照下这个blog试一下吧,说干就干,参照这,把gsoap的操作改成一下方式了:

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

  6. 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设置超时

  1. 修改gsoap自动生成的代码才能进行超时设置(我这边访问web service的代码都是gsoap工具自动生成.根据wsdl接口)
  2. 找到生成的soapwwwsdlBindingProxy.cpp文件
  3. 找到你要设置超时的那个调用服务器的方法
  4. 找到该方法代码 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 错误

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,591评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,448评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,823评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,204评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,228评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,190评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,078评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,923评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,334评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,550评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,727评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,428评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,022评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,672评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,826评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,734评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,619评论 2 354

推荐阅读更多精彩内容

  • gsoap入门 1 使用gsoap搭建web service 参考了参考文档[2]中的介绍,有一点点修改。 1.1...
    menglj阅读 8,579评论 2 3
  • 一、Java基础 1.写出下面代码的执行结果 2.写出下面代码的执行结果 3.写出下面代码的执行结果 (此题需写出...
    joshul阅读 512评论 0 1
  • ONVIF简介 ONVIF规范描述了网络视频的模型、接口、数据类型以及数据交互的模式。并复用了一些现有的标准,如W...
    ORCLee阅读 8,618评论 0 1
  • 概览 CXF frontends 是一组编程的API,被用来开发和发布webservice。CXF支持两种类型的f...
    JohnShen阅读 1,305评论 2 2
  • ❤️️对人表现出真挚的关心 1(11.04) 我们所有人—无论是屠夫、糕点师,或者是君主,任何人都喜欢那些表示对我...
    Betty_晓芳阅读 137评论 0 1