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接口的更多相关文章

  1. C#使用Thrift简介,C#客户端和Java服务端相互交互

    C#使用Thrift简介,C#客户端和Java服务端相互交互 本文主要介绍两部分内容: C#中使用Thrift简介 用Java创建一个服务端,用C#创建一个客户端通过thrift与其交互. 用纯C#实 ...

  2. RPC学习--C#使用Thrift简介,C#客户端和Java服务端相互交互

    本文主要介绍两部分内容: C#中使用Thrift简介 用Java创建一个服务端,用C#创建一个客户端通过thrift与其交互. 用纯C#实现Client和Server C#服务端,Java客户端 其中 ...

  3. Socket通讯-C#客户端与Java服务端通讯(发送消息和文件)

    设计思路 使用websocket通信,客户端采用C#开发界面,服务端使用Java开发,最终实现Java服务端向C#客户端发送消息和文件,C#客户端实现语音广播的功能. Java服务端设计 packag ...

  4. Unity3D客户端和Java服务端使用Protobuf

    转自:http://blog.csdn.net/kakashi8841/article/details/17334493 前几天有位网友问我关于Unity3D里面使用Protobuf的方法,一时有事拖 ...

  5. 三种客户端访问wcf服务端的方法 C#

    原文 http://blog.csdn.net/zlj002/article/details/7914556 string jsonstr = String.Empty; string url = & ...

  6. android客户端向java服务端post发送json

    android 端: private void HttpPostData() {        try { HttpClient httpclient = new DefaultHttpClient( ...

  7. java版gRPC实战之六:客户端动态获取服务端地址

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  8. thrift例子:python客户端/java服务端

    java服务端的代码请看上文. 1.说明: 这两篇文章其实解决的问题是,当使用python去访问大数据线上集群的时候,遇到两个问题: 1)python-hadoop和python-hive相关包链接不 ...

  9. JAVA通过http访问其他服务端API

    项目要实现这么一个功能,用户通过点击按钮,通过axios来访问python的API(算法,java不好做)得到一个结果存储到数据库并且返回到页面. 但是python不是在tomcat上面运行的,所以不 ...

随机推荐

  1. Android APK安装完成自动删除安装包

    需要实现此功能,一般实际开发是在自动版本更新上,当更新完开始自动安装完毕后,删除内存卡里的安装包.实现方式很简单,监听应用广播,获取内存卡下的文件,删除! 1.监听广播 package com.exa ...

  2. jQuery $.ajax 参数说明及调用注意事项

    $.ajax参数设置 备注:data.contentType.dataType属性值很重要!!! async 类型:Boolean 默认值: true.默认设置下,所有请求均为异步请求.如果需要发送同 ...

  3. Android开发中的神坑和知识点记录

    1.SDK Manager.exe闪退的问题 http://blog.csdn.net/fambit025/article/details/26984345 1.找到android.bat,在源码处找 ...

  4. Appium 设置手机连接方式

    使用appium的 Connection 和driver 的setConnection方法,可以切换手机的上网方式 // 切换到wifi Connection cnn = Connection.WIF ...

  5. php分享十三:mysql事物

    一:事物的隔离级别 1:隔离级别的类型 SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的: Read Uncommitted(读取未提交内容) Re ...

  6. 发一些靠谱的招聘网站(含ios)

    近日整理一些 招聘网站 , 欢迎大家 推荐 http://www.zhaopin.com 智联,貌似这货上市了.. http://www.51job.com   51job  还行 大街就不提了.0. ...

  7. RSA算法 JS加密 JAVA解密

    有这样一个需求,前端登录的usernamepassword,password必需加密.但不可使用MD5,由于后台要检測password的复杂度,那么在保证安全的前提下将password传到后台呢,答案 ...

  8. 【Unity】11.4 车轮碰撞体(Wheel Collider)

    分类:Unity.C#.VS2015 创建日期:2016-05-02 一.简介 车轮碰撞体 (Wheel Collider)专门用于创建汽车或其他移动交通工具. 车轮碰撞体是一种针对地面车辆的特殊碰撞 ...

  9. css3实现画对号动画

    目标:实现对号动画,慢慢画出来的感觉: 原理:外层div的背景是一个对号图片,用一个div做遮罩,让遮罩div层从左到右做运动一次即可实现动画,需要注意的是遮罩div的初始位置应该在外层div的外面: ...

  10. EditText: 自定义EditText 触摸时无法获取焦点

    写了一个自定义View,继承EditText,但是在触摸时无法获取到焦点. 在XML中添加 android:focusableInTouchMode="true" 设置触摸时可以获 ...