C++客户端访问Java服务端发布的SOAP模式的WebService接口
gSOAP是一个绑定SOAP/XML到C/C++语言的工具,使用它可以 简单快速地开发出SOAP/XML的服务器端和客户端
Step1 使用gsoap-2.8\gsoap\bin\win32\wsdl2h.exe生成客户端头文件。

执行该命令行,在wsdl2h.exe同目录下生成hellowebservice.h头文件。生成C++版本,不使用STL的头文件。wsdl2h.exe命令还有很多参数可选,wsdl2h.exe –h显示帮助信息。
Step2 使用gsoap-2.8\gsoap\bin\win32\ soapcpp2.exe生成桩文件。借助这些桩函数,在C++中可以像调用本地函数一样访问远程服务器上的WebService服务。

Soapcpp2.exe还有很多参数可选,输入 soapcpp2.exe –h可查看帮助。执行上述命令后生成的如下文件(将红框内的文件拷贝到VS2010工程中):

但是运行完毕后得到的结果为NULL。
貌似是因为soap.namespaces变量为NULL造成的,再运行程序证实了这个猜测,soap.namespaces果然为NULL; 于是尝试在soap对象创建后,添加如下代码,问题解决。
if(!soap->namespaces)
soap->namespaces=namespaces;
// namespaces变量定义在#include "FaceDbServiceSoap11Binding.nsmap"
解决方案
虽然这样解决了问题,但还是不知道为什么呀,网上其他的教程中没有提到要手工设置soap.namespaces变量呀。 于是想到跟踪soap对象的代码,看看namespaces变量是怎么被初始化的。找到了这里(soap_versioning(soap_init)(struct soap *soap, soap_mode imode, soap_mode omode)函数中),看到这里瞬间明白了。:

因为我在用gsoapcpp2生成gosap C++客户端代码的时候使用了-DWITH_NONAMESPACES编译stdsoap2.cpp文件,所以这里初始化soap对象时就将namespaces指针赋值为NULL。
如果使用了-DWITH_NONAMESPACES定义,就必须显式的使用soap_set_namespaces为soap对象指定namespace。
到此,问题基本算是搞清楚了,导致soap请求数据格式错误的直接原因是soap初始化时没有指定namespace。
解决方案1
去掉编译stdsoap2.cpp文件设置的-DWITH_NONAMESPACES宏定义 这个方法最简单,但在multi-client and multi-server builds模式下并不适合,因为这种模式下必须使用-DWITH_NONAMESPACES宏定义,参见《9.1 soapcpp2 Options》
解决方案2
在soap对象初始化后用soap_set_namespaces函数为soap对象指定namespace。 这个方法也不复杂,只是添加一行代码,前面的测试代码修改如下:
https://blog.csdn.net/10km/article/details/52198306
https://blog.csdn.net/ylforever/article/details/44513171
https://blog.csdn.net/dongdan_002/article/details/46790879
C++客户端访问Java服务端发布的SOAP模式的WebService接口的更多相关文章
- C#使用Thrift简介,C#客户端和Java服务端相互交互
C#使用Thrift简介,C#客户端和Java服务端相互交互 本文主要介绍两部分内容: C#中使用Thrift简介 用Java创建一个服务端,用C#创建一个客户端通过thrift与其交互. 用纯C#实 ...
- RPC学习--C#使用Thrift简介,C#客户端和Java服务端相互交互
本文主要介绍两部分内容: C#中使用Thrift简介 用Java创建一个服务端,用C#创建一个客户端通过thrift与其交互. 用纯C#实现Client和Server C#服务端,Java客户端 其中 ...
- Socket通讯-C#客户端与Java服务端通讯(发送消息和文件)
设计思路 使用websocket通信,客户端采用C#开发界面,服务端使用Java开发,最终实现Java服务端向C#客户端发送消息和文件,C#客户端实现语音广播的功能. Java服务端设计 packag ...
- Unity3D客户端和Java服务端使用Protobuf
转自:http://blog.csdn.net/kakashi8841/article/details/17334493 前几天有位网友问我关于Unity3D里面使用Protobuf的方法,一时有事拖 ...
- 三种客户端访问wcf服务端的方法 C#
原文 http://blog.csdn.net/zlj002/article/details/7914556 string jsonstr = String.Empty; string url = & ...
- android客户端向java服务端post发送json
android 端: private void HttpPostData() { try { HttpClient httpclient = new DefaultHttpClient( ...
- java版gRPC实战之六:客户端动态获取服务端地址
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- thrift例子:python客户端/java服务端
java服务端的代码请看上文. 1.说明: 这两篇文章其实解决的问题是,当使用python去访问大数据线上集群的时候,遇到两个问题: 1)python-hadoop和python-hive相关包链接不 ...
- JAVA通过http访问其他服务端API
项目要实现这么一个功能,用户通过点击按钮,通过axios来访问python的API(算法,java不好做)得到一个结果存储到数据库并且返回到页面. 但是python不是在tomcat上面运行的,所以不 ...
随机推荐
- Android之内存泄露、内存溢出、内存抖动分析
内存 JAVA是在JVM所虚拟出的内存环境中运行的,内存分为三个区:堆.栈和方法区.栈(stack):是简单的数据结构,程序运行时系统自动分配,使用完毕后自动释放.优点:速度快.堆(heap) ...
- 【转】Markdown 的一些问题
Markdown 的一些问题 把我之前的博文基本上转换成了 markdown 格式.我发现 markdown 虽然在编辑器里看起来比 HTML 清晰一些,但也有一些不足. 这些 markup 语言的格 ...
- xml中的<![CDATA[]]> 简介
被<![CDATA[]]>这个标记所包含的内容将表示为纯文本,比如<![CDATA[<]]>表示文本内容“<”. 此标记用于xml文档中,我们先来看看使用转义符的 ...
- H5 设备方向及运动API
传送门:https://blog.csdn.net/Panda_m/article/details/57515195 入门的demo: <!DOCTYPE html> <html l ...
- Java获取请求客户端的真实IP地址
整理网友的材料,最后有源码,亲测能解决所有java获取IP真实地址的问题 整理的这里: 1.链接1 2.链接2 JSP里,获取客户端的IP地址的方法是: request.getRemoteAddr() ...
- jumpserver 3.2修改排序规则
在默认的情况下,我们使用jumpserver的时候 这里我使用xshell 客户端连接到堡垒机的时候, 这里我的显示规则是根据IP排序的,但是我这里的服务器的hostname 都是根据场景设置的hos ...
- Java:集合,对列表(List)中的自定义对象按属性(字段)排序(正序、倒序)的方法
1. 要求 对列表(List)中的自定义对象,要求能够按照对象的属性(字段)进行排序(正序.倒序). 如:用户对象(Member)有用户名(username).级别(level).出生日期(birth ...
- Git--团队开发必备神器
花了两天时间专门搞了一下git.整理一下分享给大家.以下我们開始.. . 转载请注明出处: http://blog.csdn.net/Hello_Chillax/article/details/474 ...
- 设计模式-装饰模式(Decorator Pattern)
装饰模式(Decorator Pattern):动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活
- 【qt】QT 的信号与槽机制
QT 是一个跨平台的 C++ GUI 应用构架,它提供了丰富的窗口部件集,具有面向对象.易于扩展.真正的组件编程等特点,更为引人注目的是目前 Linux 上最为流行的 KDE 桌面环境就是建立在 QT ...