C++利用gSoap调用WebService服务
最近要利用C++调用WebService接口,中间工具是gSoap,IDE:VS2010,WebService接口:http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl
关于Soap,它是一种简单对象访问协议,是一种轻量的、简单的、基于 XML 的协议,它被设计成在 WEB 上交换结构化的和固化的信息。它是一种通信协议,用于Web应用程序之间的因特网通信,它提供一组不受平台和语言限制的方法使应用程序得以相互之间进行Intertnet通信。而gSoap可以看做是对soap的一个实现封装,它隐藏了在调用WebService中的大量实现细节,使得C++调用WebService变得较为简单。它提供编译工具(实际就是针对接口的WSDL生成类文件),然后引入工程操作生成类即可达到访问WebService接口的目的。仔细查看生成的文件就会发现生成的类与WebService接口的WSDL文件实际相对应的。
WSDL,最初弄的WSDL的时候被这个WSDL弄的焦头烂额的。这个文件实际上就是WebService的对外接口文件,它是一个XML文件,描述了WebService接口的外部方法和抽象方法,以及各协议下的相关调用,是一个用来描述Web服务和说明如何与Web服务通信的XML语言,为用户提供详细的接口说明书。对于WSDL文件,只需要在浏览器中打开,即可查看到WebService接口的外部供调用的方法。
对于Soap,gSoap,WSDL就大致介绍到这里,这里记录如何在C++中调用WebService接口,以http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl为例,一个查询手机号码归属地的WebService接口。
下载gSoap-2.8版本解压放置D盘,在命令行下进入gSoap-2.8/gsoap/bin/win32目录。网络上有不少gSoap的下载,读者可自行下载。
然后运行命令:wsdl2h -s -o service1.h http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl,这时在wsdl2h.exe目录下生成service1.h头文件,然后运行命令:soapcpp2 -C -x service1.h生成其他的文件,在我的目录下生成了这些文件:
第一个红色圈圈里面都是生成的文件,要全部引入工程,其中soapClientLib.cpp文件无用,不引入,引入会报错。然后将gSoap-2.8/目录喜爱的stdsoap2.h/cpp也要引入工程。
取消soapC.cpp,soapClient.cpp,stdsoap2.cpp这三个文件的预编译头,在stdafx.h文件中增加#include"MobileCodeWSSoap.nsmap"
从webService获取数据:
- void callService()
- {
- LOG_TRACE_METHOD();
- struct soap soap;
- char* str="";
- wchar_t* str_1 = NULL;
- int b=0;
- class _ns1__getMobileCodeInfoResponse resultStr;
- class _ns1__getMobileCodeInfo a;
- soap_init(&soap);
- soap_set_mode(&soap,SOAP_C_MBSTRING);
- a.mobileCode = ConvAnsiToUtf8("18600960941");
- soap_call___ns2__getMobileCodeInfo(&soap,"http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl","",&a,&resultStr);
- if (soap.error)
- {
- soap_print_fault(&soap, stderr);
- }
- else
- {
- str = resultStr.getMobileCodeInfoResult;
- std::cout << str << endl;
- }
- soap_destroy(&soap);
- soap_end(&soap);
- soap_done(&soap);
- }
运行后如图:
我们可以查看http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl,查看该xml文件可看到字符编码是UTF8的,因此传递给接口的参数需要转换到UTF8才可,ConvAnsiToUtf8()是转换函数。gsoap 的 核心内部是入和出都是UTF8编码的,由于中文是多字节的,所以将多字节的按照UTF8转换,最终结果就是乱码。正确的方式应该是:soap_set_mode(&soap,SOAP_C_MBSTRING);这样中文便不会乱码,可正常返回。
C++利用gSoap调用WebService服务相关推荐
- 利用JaxWsDynamicClientFactory 调用webservice 报错解决
2019独角兽企业重金招聘Python工程师标准>>> 1.Spring启动跑错,不能存在多个实例cfx,经百度后发现为配置文件出错 改成 <jaxws:endpoint id ...
- Axis2调用WebService服务的3种方式(rpc调用不好用)
第一,RPC方式,不生成客户端代码,引入相应的axis2的jar包(不好用) 注意:暂时没有成功调用,没有参数传递时远程调用成功,当有参数传递时远程调用失败: package com.ming.axi ...
- Python调用WebService服务 查询天气预报
文章目录 问题描述 安装 初试 修复Schema 天气预报封装 参考文献 问题描述 Python调用Webservice服务,如WebXml的免费Web服务中的城市天气预报 安装 使用suds库的分支 ...
- gsoap搭建WebService服务
WebService.soap.gsoap基本概念 WebService服务基本概念:就是一个应用程序,它向外界暴露出一个可以通过web进行调用的API,是分布式的服务组件.本质上就是要以标准的形式实 ...
- 标准C/C++程序通过gSOAP调用WebService
一. 环境准备 在本文中,所有程序均在Linux下开发完成,经测试能够正常运行. 在开发过程中,我们需要用到gSOAP,可以从以下网址下载获得:[url]http://www.cs.fsu.edu/~ ...
- 利用axis调用webservice接口
package test;import javax.xml.namespace.QName;import org.apache.axis.client.Call; import org.apache. ...
- Python调用webservice服务【suds-py3组件使用】
先记录一下背景: 工作中一次与其他系统进行接口调用调试时,对方提供了webservice的一套服务文档和调用参数说明.what?webservice?没怎么用过,以为和API形式的调用差不多,但基于尊 ...
- java 解析http返回的xml_Java解析调用webservice服务的返回XML串详解
本文由Markdown语法编辑器编辑完成. 1. 需求分析: 已知当在调用某一webservice的服务时,如果调用成功,会接受到该服务的返回XML串.后端在获取了该XML原始串时,需要进行解析,将其 ...
- 解决 -- java 调用webservice 服务端收到参数为null
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 我的客户端和服务端都写的很简单,只是调用服务的时候, 服务端得不到参数,后来发现只改一个地方就可以了 ...
最新文章
- 怎么逐步突破,成为Python高手?
- Jquery常用操作:checkbox、select取值,radio、checkbox、select选中及其相关
- Linux常用系统备份、恢复命令
- 循环相关函数range、enumerate、zip
- java 异步事件_Java编程入门——异步事件:轮询与中断
- python文件操作总结
- 如何基于MindSpore实现万亿级参数模型算法?
- PAT (Basic Level) Practice (中文)1041 考试座位号 (15 分)
- MindManager 2020注册机下载
- EI的检索方法快速检索(Quick Search)
- 【洛谷搬运】NOIP2018 退役记
- 【项目经验】拦截器拦截入参出参
- 一个自建的Java命令行解析参数类ArgumentsParser
- 苹果退款回调地址要求
- Schlemm管内荧光素钠造影术/活化PⅡb/Ⅲa配体MRI显影剂/肝素标记超顺磁氧化铁粒子(Hep-SPIO)
- 代谢组学分析常用网站
- FZU:I. Fire Game
- 华为诺亚实验室:端侧AI模型的技术进展与未来
- Vuforia 系列讲解 – 02 环境搭建
- nodejs女生穿衣搭配系统vue