C++客户端访问Java服务端发布的SOAP模式的WebService接口

gSOAP是一个绑定SOAP/XML到C/C++语言的工具,使用它能够 简单快速地开发出SOAP/XML的服务器端和客户端html

Step1 使用gsoap-2.8\gsoap\bin\win32\wsdl2h.exe生成客户端头文件。web

执行该命令行,在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)函数中),看到这里瞬间明白了。:ui

由于我在用gsoapcpp2生成gosap C++客户端代码的时候使用了-DWITH_NONAMESPACES编译stdsoap2.cpp文件,因此这里初始化soap对象时就将namespaces指针赋值为NULL。spa

若是使用了-DWITH_NONAMESPACES定义,就必须显式的使用soap_set_namespaces为soap对象指定namespace。.net

到此,问题基本算是搞清楚了,致使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

相关文章
相关标签/搜索