当前位置:   article > 正文

Linux下 C/C++ Web Service开发(gsoap + wsdl 生成客户端)_linux gsoap wsdl

linux gsoap wsdl

目的:利用客户提供的wsdl地址,实现一个短信发送接口。

实现思路:在Linux环境中,利用gsoap工具生成客户端框架。

实现环境:

     系统环境:Centos6.4

     gsoap:gsoap2.8.66

一、环境配置

1. 安装gsoap

     安装流程:https://blog.csdn.net/g1269420003/article/details/81315827

     gsoap安装包路径: /usr/tmp/gsoap-2.8/

     gsoap安装路径: /usr/local/gSOAP/

2. 配置gsoap环境

     需要的gsoap工具wsdl2hsoapcpp2,在/usr/local/gSOAP/bin/路径下

     在gSOAP下新建src文件夹,作为我们的工作目录。

     在src下新建sendMsg文件夹,用于生成发送短信的客户端代码,之后的操作不加以说明的话,都在这个目录下进行。

二、生成Web Service客户端

1. 生成C++头文件

     使用gsoap工具wsdl2h生成C/C++语法结构的头文件,命令如下:

../../bin/wsdl2h -s -o sendMsg.h http://218.65.***.***:****/Service/WebService.asmx?wsdl

     在sendMsg目录下生成sendMsg.h头文件

     该命令的目的:实现wsdl到头文件的映射

     上述命令的各选项含义如下:

        -s  不生成STL代码

        -o  头文件名称     将头文件内容保存在sendMsg.h中

     可以使用 wsdl2h -help 来查看wsdl2h的用法

2. 生成存根文件和客户端代码框架

     使用gsoap的预编译器soapcpp2,根据上一步得到的头文件来生成存根文件(soapStub.h)和客户端代码框架。

../../bin/soapcpp2 -i -x -C sendMsg.h 

     在sendMsg目录下生成6个文件:

  1. [root@ifcos sendMsg]#ls
  2. sendMsg.h soapH.h soapWebServiceSoapBindingProxy.cpp WebServiceSoapBinding.nsmap
  3. soapC.cpp soapStub.h soapWebServiceSoapBindingProxy.h

     上述命令的各选项含义如下:

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

       -x  不要产生XML示例文件

       -C 仅生成客户端代码

     可以使用./soapcpp2 -help查看soapcpp2的用法

3. 编写客户端代码

     从客户提供的接口说明中,确定要调用的函数,在soapWebServiceSoapBindingProxy.cpp文件中可以看到该函数的实现,以及需要传递的参数,编写出客户端代码。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "WebServiceSoapBinding.nsmap"
  5. #include "soapWebServiceSoapBindingProxy.h"
  6. using namespace std;
  7. int main()
  8. {
  9. struct soap soap;
  10. WebServiceSoapBindingProxy proxy;
  11. _ns1__PostSingle *ns1__PostSingle = new _ns1__PostSingle();
  12. ns1__PostSingle->account = "******";
  13. ns1__PostSingle->password = "******";
  14. ns1__PostSingle->mobile = "******";
  15. ns1__PostSingle->content = "你好";
  16. ns1__PostSingle->subid = "1";
  17. ns1__PostSingle->orgCode = "2";
  18. ns1__PostSingle->msgFmt = 1;
  19. _ns1__PostSingleResponse *ns1__PostSingleResponse = new _ns1__PostSingleResponse();
  20. int ret = proxy.PostSingle(ns1__PostSingle, *ns1__PostSingleResponse);
  21. soap_set_mode(&soap, SOAP_C_UTFSTRING);
  22. printf("ret=%d,ns1__PostSingleResponse->PostSingleResult=%d\n",ret,ns1__PostSingleResponse->PostSingleResult);
  23. }

4.  编译客户端

     将gsoap安装包路径  /usr/tmp/gsoap-2.8/gsoap/下面的stdsoap2.cpp拷贝到sendMsg文件夹下

     同时将gsoap安装路径 /usr/local/gSOAP/include下的stdsoap2.h拷贝到sendMsg文件夹下,之后的编译过程中会用到

     编译源文件,这里一共四个源文件:

  1. g++ -c soapC.cpp soapWebServiceSoapBindingProxy.cpp stdsoap2.cpp sendMsg.cpp
  2. g++ *.o -o sendMsg.exe

     生成可执行文件sendMsg.exe。

5. 后记

     然而,虽然可以收到短信,中文却是乱码。

     发送“你好”,手机收到的的乱码为你好。

     查资料发现这是由于使用ISO8859-1解码经过UTF-8编码的字符串,具体情况如下:

     “你好”的UTF-8编码为 e4 bd a0 | e5 a5 bd 

     UTF8编码或GBK编码,再由ISO8859-1解码。对照ISO8859-1编码表后发现:e4 bd a0分别对应三个字符:"ä½ ",e5 a5 bd分别对应三个字符"好"。

     这个问题最终也没有解决,后来改换Java,在Eclipse中开发客户端,打包为jar文件在Linux中调用。

【参考文章】

     1. https://blog.csdn.net/houqd2012/article/details/44095511

     2. https://www.jianshu.com/p/63c7ad13907a

     3. gSoup用户手册:https://www.genivia.com/doc/guide/html/index.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/278872
推荐阅读
相关标签
  

闽ICP备14008679号