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 错误

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349436.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

go语言io reader_【已解决】go语言中如何使用io的MultiWriter

【背景】折腾:期间,需要去搞懂:如果新建和设置MultiWriter。【折腾过程】1.参考:去看看:2.然后去试试代码:var filenameOnly stringfilenameOnly GetCurFilename()fmt.Println("filenameOnly", …

python声明编码为gbk_Python字符串编码坑彻底详细解决

来源:实习僧 作者:实习僧的何梁 真正完全搞清楚Python的编码问题 我想大家经常被Python的编码问题搞的晕头转向,下面我一头来自实习僧的牛,为您详细解析这个天坑: 请看图: 1、python中一切皆对象,字符对象分…

golang 包含文本_Golang教程之Web篇(七)

首先,大家一起思考一个问题:何为Web编程?严格来说,这只是一个叫法,并没有学术上的定义,但是一般大家都说到web都是指浏览器相关,所以大家一般说的web开发要么是PC Web要么就是手机Web&#xff0…

junit 测试 异常_使用JUnit规则测试预期的异常

junit 测试 异常这篇文章展示了如何使用JUnit测试预期的异常。 让我们从我们要测试的以下类开始: public class Person {private final String name;private final int age;/*** Creates a person with the specified name and age.** param name the name* param …

delphi switch语句例子_Java 14 祭出增强版 switch,真香!!

Java14:栈长,我还有机会吗?栈长:必须有!今天说下switch!关注Java技术栈的朋友应该都知道,switch 在 JDK 12 中进行增强了,并且在 JDK 12/13 中一直是预览特性,刚出来的时…

呼叫我,或异步REST

本文是使用Spring Boot Java 8进行的异步REST应用程序工作的非常简单的示例。SpringBoot使Web应用程序的开发几乎非常容易,但是为了简化任务,我从Spring存储库中举了一个例子,称为rest- service ,将其分叉到我自己的存储库中 &am…

python中break可以用在for和if中吗_Python的for和break循环结构中使用else语句的技巧...

在Python中的while或者for循环之后还可以有else子句,作用是for循环中if条件一直不满足,则最后就执行else语句。 1 2 3 4 5 6 7 8 9 10 11 for iin range(5): if i 1: print in for else: print in else print after for-loop # in for # in else # after…

ldconfig mysql_ldconfig命令介绍

ldconfig是一个动态链接库管理命令,其目的为了让动态链接库为系统所共享。**ldconfig的主要用途:默认搜寻/lilb和/usr/lib,以及配置文件/etc/ld.so.conf内所列的目录下的库文件。搜索出可共享的动态链接库,库文件的格式为&#xf…

sqoop 导入到hive字段全是null_Sqoop 一点通

sqoop 是什么?sqoop 主要用于异构数据:1. 将数据从hadoop,hive 导入、导出到关系型数据库mysql 等;2. 将关系型数据库 mysql 中数据导入、导出到 hadoop 、hve 。sqoop 版本说明sqoop 1 版本主要从1.4.0 到 1.4.7;sqoop 2 版本主要…

php使用pdo操作mysql数据库实例_php使用PDO操作MySQL数据库实例_PHP

本文实例讲述了php使用PDO操作MySQL数据库的方法。分享给大家供大家参考。具体分析如下:PDO是mysql数据库操作的一个公用类,我们不需要进行自定类就可以直接使用pdo来操作数据库,但是在php默认配置中pdo是未开启所以我们必须先在php.ini中开启它才可以使用,这里来详…

雅虎yql_从RSS Feed和YQL创建数据表

雅虎yqlYahoo Query Language( YQL )是一种查询语言,例如SQL。 使用YQL,我们可以跨Web服务 查询 , 过滤和联接数据。 YQL也可以阅读RSS feed。 响应可以是JSON或XML。 雅虎提供了一个YQL控制台,用于调试…

python入门之函数调用第二关_Python基础语法学习笔记之风变第九关函数

一、初识函数 1、函数的作用 2、函数的组成 函数(Function)能实现的功能从简单到复杂,各式各样,但其本质是相通的,我们可以看作成三个部分。 3、定义和调用函数 def math(x): y 3*x 5 return y 第1行:def…

流与装饰器

几年前, Streams API随lambda表达式一起在Java 8中引入。 作为一个熟练的Java专家,我尝试在我的一些项目中使用此新功能,例如here和here 。 我不是很喜欢它,然后又回到了好的老房子里。 此外,我创建了装饰库Cactoos来取…

流线动态图python_Node.js Stream(流)

Node.js Stream(流) Stream 是一个抽象接口,Node 中有很多对象实现了这个接口。例如,对http 服务器发起请求的request 对象就是一个 Stream,还有stdout(标准输出)。 Node.js,Stream 有四种流类型&#xff1…

gacutil不是内部或外部命令_Win7命令提示符输入taskkill提示不是内部或外部命令...

使用win7系统的用户,想在命令提示符下使用taskkill命令删掉进程的时候,却提示taskkill不是内部或外部命令,也不是可运行的程序,遇到这样的问题,这位用户不知道怎么解决。所以给大家带来了解决方法教程,希望…

mysql两台服务器怎么做数据同步_两台mysql服务器实现双机互备配置并测试数据同步...

对于实现两台机子的互备配置,本文作出了详细的介绍,之后的测试数据同步,在10.168.1.44服务器数据库里修改一条数据, 可以看到数据已经同步过来了。反过来,修改10.168.0.126的数据,也可以看到10.168.1.44数据…

excel 复制数据 sql server 粘贴_win32 实现 excel 快速复制粘贴

直接简明说:该方法可以直接将一张代码的区域内容直接 copy 到另一张表上,并且字体颜色、背景、格式都不变,另外还可以 copy 公式(相当于 excel 下拉公式)from win32com.client import Dispatchimport win32com.clientdef writeCol(filename):…

什么是JAX-RS注释?

JAX-RS概述(第1部分) JAX-RS API构成Java EE平台承诺提供标准驱动技术的重要组成部分。 互联网无处不在的性质以及对微服务体系结构的日益增长的兴趣已将更多的精力放在小型可扩展的自治服务及其互操作性上。 允许微服务彼此之间以及“外部世界”之间进行…

oracle 查询过去一个星期的数据_过去一星期,最懂我的居然是一个表情包

文/黄亚男编辑/大风微信表情包上新快一周了,除了各个聊天对话框、朋友圈,蔓延到了其它社交平台。小黄脸表情伴随着微信的诞生和升级,迄今在微信上已经四次更新。每一次几乎有一个出圈的表情:第一次是“笑哭”;第二次则…

mysql的count报错_Mysql报错注入原理分析(count()、rand()、group by)

报错需要count(*),rand()、group by,三者缺一不可前提:当行数大于等于3行时才会报错。原链接:https://www.cnblogs.com/xdans/p/5412468.html几个fool()原理解释:selectcount(*),floor(rand(0)*2) from test group by …