zoukankan      html  css  js  c++  java
  • 如何在C++中使用WebService

    gsoap主页

     

    使用gsoap生成所需的WebService

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

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

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

    我的做法是拷贝一个cmd的快捷方式进来,然后右键属性,把它的“起始位置”设置为F:webSitegsoap_2.8.18gsoap-2.8gsoapinwin32,应用后启动此快捷方式,那么操作目录就为当前目录了。利用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:Websitegsoap_2.8.18gsoap-2.8gsoapimport

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

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

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

    注意:

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

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

    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

  • 相关阅读:
    Java 的this和super关键字
    Java关于访问控制权限
    Java 封装 继承 多态
    Java的集成开发工具
    如何查询小程序中的代码量
    小程序中使用echarts及使用的坑
    微信小程序-新的页面授权机制
    前端处理几十万条数据不卡顿(window.requestAnimationFrame)
    Vs code中Eslint 与 Prettier格式化冲突
    从原型与原型链的角度看es6 class
  • 原文地址:https://www.cnblogs.com/findumars/p/5928688.html
Copyright © 2011-2022 走看看