gsoap主页

 

使用gsoap生成所需的WebService

下载后的gsoap包为:(点击到我的资源中下载)

将他解压后,进入到文件夹:gsoap_2.8.18\gsoap-2.8\gsoap\bin\win32

里面有2个我们要用到的exe,wsdl2h.exe和soapcpp2.exe,如果缺少一个typemap.dat,则从gsoap_2.8.18\gsoap-2.8\gsoap下拷贝进来,最后就可以启用cmd,开始生成WebService了

我的做法是拷贝一个cmd的快捷方式进来,然后右键属性,把它的“起始位置”设置为F:\webSite\gsoap_2.8.18\gsoap-2.8\gsoap\bin\win32,应用后启动此快捷方式,那么操作目录就为当前目录了。利用wsdl2h.exe,使用cmd生成WebService的头文件如下:

wsdl2h -o 头文件名 WSDL文件名或URL

说明:(注意大小写)

-o 文件名,指定输出头文件名

-n 命名空间前缀 代替默认的ns

-c 产生纯C代码,否则是C++代码

-s 不要使用STL代码

-t 文件名,指定type map文件,默认为typemap.dat

-e 禁止为enum成员加上命名空间前缀

这里我生成一个foxwelltech.h头文件,不使用STL,结果如下:

生成的foxwelltech.h就包含了所有预先写好的WebService函数接口。从cmd中可以看到该命令需要用到typemap.dat文件,所以如果没有该文件,会提示找不到文件,需要从别处拷贝过来。接下来,我们按照cmd最后的提示,进行下一步,用soapcpp2.exe来生成可用的.h和.cpp文件:

soapcpp2常用选项:(注意大小写)

-C 仅生成客户端代码

-S 仅生成服务器端代码

-L 不要产生soapClientLib.c和soapServerLib.c文件

-c 产生纯C代码,否则是C++代码(与头文件有关)

-I 指定import路径(见上文)

-x 不要产生XML示例文件

-i 生成C++包装,客户端为xxxxProxy.h(.cpp),服务器端为xxxxService.h(.cpp)

如果报错:Critical error: #import: Cannot open file "stlvector.h"for reading.

Hint: use option -I<path> (you candefine multiple paths separated with ';')

则要使用-I选项指定gSOAP的 import文件路径

我使用的命令行是:

soapcpp2 -C -x foxwelltech.h -IF:\Website\gsoap_2.8.18\gsoap-2.8\gsoap\import

意为根据foxwelltech.h只生成客户端代码,不生成无用的xml文件,另外要引用一个import文件夹,结果如下:

最后的Compilation successful说明了一切,结果就是生成了一个nsmap命名空间文件,二个.h文件,三个.cpp文件

最后,我们新建一个C++的控制台工程来使用它们

注意:

1.      第一步生成的foxwelltech.h不用加进来,直接使用由它生成的后续.h和.cpp即可

2.      stdsoap2.h和stdsoap2.cpp来自于路径:F:\Website\gsoap_2.8.18\gsoap-2.8\gsoap

3.      除nsmap文件外,其他6个都要添加到工程里面编译,然后添加测试代码

工程截图:

运行结果截图:

可以看到返回的UserLoginResult为{"MSG_CODE":1,"MSG_INFO":""},这是我这个项目约定的通讯格式,MSG_CODE为1代表成功,意为这里的登陆测试代码运行结果为登陆成功,同理,修改代码将用户名密码设为空再登陆,则运行结果为:

这样则为登陆失败

补充说明

1.       使用WebService所调用的函数到一开始生成的foxwelltech.h中查找,再在函数名前加上soap_call_即可。如在foxwelltech.h中找到了登陆函数__tempuri__UserLogin,再加上前缀后变成了soap_call___tempuri__UserLogin_(好像后面还多了一个下划线),发现这个函数是在soapClient.cpp中实现的,所以也验证了之前说的,不需要在工程中添加foxwelltech.h

2.      如果在vc中开发的话,引入的3个cpp文件要进行设置不使用预编译头文件,方法:工程 -》设置 -》选择cpp文件 -》预编译头 -》选择不使用。另一方面,soap也是使用socket通信的所以链接的时候还要加上wsock32.lib,方法:工程-》设置-》链接在后面加上wsock32.lib即可

3.      nsmap命名空间文件最好是用#include写在stdafx.h文件中

4.      gsoap的核心内部入和出都是UTF8编码的,由于中文是多字节的,所以将多字节的按照UTF8转换,最终结果就是乱码。正确的方式应该是:soap_set_mode(&soap,SOAP_C_MBSTRING);这样中文便不会乱码,可正常返回

5.      参考链接:

http://yangzb.iteye.com/blog/422463

http://blog.csdn.net/shaoyuan1943/article/details/8184341

http://blog.sina.com.cn/s/blog_4900f3fb0100j94p.html

http://blog.csdn.net/dingxz105090/article/details/40043959

如何在C++中使用WebService的更多相关文章

  1. 在Android中调用WebService

    某些情况下我们可能需要与Mysql或者Oracle数据库进行数据交互,有些朋友的第一反应就是直接在Android中加载驱动然后进行数据的增删改查.我个人不推荐这种做法,一是手机毕竟不是电脑,操作大量数 ...

  2. 如何在SpringMVC项目中部署WebService服务并打包生成客户端

    场景 某SpringMVC项目原本为一个HTTP的WEB服务项目,之后想在该项目中添加WebService支持,使该项目同时提供HTTP服务和WebService服务.其中WebService服务通过 ...

  3. 如何在springMVC 中对REST服务使用mockmvc 做测试

    如何在springMVC 中对REST服务使用mockmvc 做测试 博客分类: java 基础 springMVCmockMVC单元测试  spring 集成测试中对mock 的集成实在是太棒了!但 ...

  4. C++程序中调用WebService的实现

    前言 因为最近的项目中需要运用到在MFC程序中调用WebService里面集成好了的函数,所以特意花了一天的时间来研究WebService的构建以及如何在MFC的程序中添加Web引用,进而来实现在C+ ...

  5. 我是如何在SQLServer中处理每天四亿三千万记录的

    首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地方,请各位数据库大牛给予指正,以便我能够更好的处理此次业务. ...

  6. 如何在SpringBoot中使用JSP ?但强烈不推荐,果断改Themeleaf吧

    做WEB项目,一定都用过JSP这个大牌.Spring MVC里面也可以很方便的将JSP与一个View关联起来,使用还是非常方便的.当你从一个传统的Spring MVC项目转入一个Spring Boot ...

  7. 如何在latex 中插入EPS格式图片

    如何在latex 中插入EPS格式图片 第一步:生成.eps格式的图片 1.利用visio画图,另存为pdf格式的图片 利用Adobe Acrobat裁边,使图片大小合适 另存为.eps格式,如下图所 ...

  8. 如何正确的使用json?如何在.Net中使用json?

    什么是json json是一种轻量级的数据交换格式,由N组键值对组成的字符串,完全独立于语言的文本格式. 为什么要使用json 在很久很久以前,调用第三方API时,我们通常是采用xml进行数据交互,但 ...

  9. [原创]如何在Parcelable中使用泛型

    [原创]如何在Parcelable中使用泛型 实体类在实现Parcelable接口时,除了要实现它的几个方法之外,还另外要定义一个静态常量CREATOR,如下例所示: public static cl ...

随机推荐

  1. JQuery AJAX请求aspx后台方法

    利用JQuery封装好的AJAX来请求aspx的后台方法,还是比较方便的,但是要注意以下几点: 1.首先要在方法的顶部加上[WenMethod]的特性(此特性要引入using System.Web.S ...

  2. SQL Server自动化运维系列 - 多服务器数据收集和性能监控

    需求描述 在生产环境中,很多情况下需要采集数据,用以定位问题或者形成基线. 关于SQL Server中的数据采集有着很多种的解决思路,可以采用Trace.Profile.SQLdiag.扩展事件等诸多 ...

  3. 命令精解之DOS批处理

    前言 最近对于批处理技术的探讨比较热,也有不少好的批处理程序发布,但是如果没有一定的相关知识恐怕不容易看懂和理解这些批处理文件,也就更谈不上自己动手编写了,古语云:“授人以鱼,不如授人以渔.”因为网上 ...

  4. linux/windows系统oracle数据库简单冷备同步

    linux/windows系统oracle数据库简单冷备同步 我们有一个财务系统比较看重财务数据的安全性,同时我们拥有两套系统,一个生产环境(linux),一个应急备份环境(windows).备份环境 ...

  5. iOS开发——短信验证码

    作为iOS开发者,大家都应该知道ShareSDK这个比较出名的第三方分享(带统计功能)开发工具包. 他的官网今年年初发布了短信验证码的SDK.本文介绍它的短信验证码SDK.(部分过程参考官网如何集成的 ...

  6. Linux下通过软链接转移mysql目录,解决分区空间不足(转)

    http://darwinclub.info/wp/?p=454(转) 当存放数据库分区的空间不足时,可以采取对数据库目录进行迁移的方法,具体步骤如下:1.先关闭数据库mysqladmin -p sh ...

  7. PHP & Javascript 如何对字符串中包含html标签进行编码 整理

    为什么要对字符串编码? 某些字符串中包含html标签,不编码,页面输出就乱了. PHP下怎么对字符串编码? htmlentities vs htmlspecialchars htmlentities ...

  8. 通过telnet使用smtp协议发送邮件

    smtp协议是一个简单的邮件传输协议,利用它我们可以将邮件发送给别人,这里将通过telnet这个程序利用smtp协议从网易向gmail发送一封邮件 网上不少有说使用telnet发送邮件的文章,我也看过 ...

  9. linux shell 逻辑运算符

    一.逻辑卷标 逻辑卷标 表示意思 1. 关于档案与目录的侦测逻辑卷标! -f 常用!侦测『档案』是否存在 eg: if [ -f filename ] -d 常用!侦测『目录』是否存在 -b 侦测是否 ...

  10. [JS]Cookie精通之路

    [JS]Cookie精通之路 转http://blog.163.com/neu_pdh1983/blog/static/572407020077310528915/ 发布:Cary 媒体:www.Ju ...