赞
踩
目的:利用客户提供的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工具wsdl2h和soapcpp2,在/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个文件:
- [root@ifcos sendMsg]#ls
- sendMsg.h soapH.h soapWebServiceSoapBindingProxy.cpp WebServiceSoapBinding.nsmap
- soapC.cpp soapStub.h soapWebServiceSoapBindingProxy.h
上述命令的各选项含义如下:
-i 生成C++封装代理,客户端为xxxxProxy.h(.cpp),服务器端为xxxxService.h(.cpp)
-x 不要产生XML示例文件
-C 仅生成客户端代码
可以使用./soapcpp2 -help查看soapcpp2的用法
3. 编写客户端代码
从客户提供的接口说明中,确定要调用的函数,在soapWebServiceSoapBindingProxy.cpp文件中可以看到该函数的实现,以及需要传递的参数,编写出客户端代码。
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
-
- #include "WebServiceSoapBinding.nsmap"
- #include "soapWebServiceSoapBindingProxy.h"
-
- using namespace std;
-
- int main()
- {
- struct soap soap;
- WebServiceSoapBindingProxy proxy;
- _ns1__PostSingle *ns1__PostSingle = new _ns1__PostSingle();
-
- ns1__PostSingle->account = "******";
- ns1__PostSingle->password = "******";
- ns1__PostSingle->mobile = "******";
- ns1__PostSingle->content = "你好";
- ns1__PostSingle->subid = "1";
- ns1__PostSingle->orgCode = "2";
- ns1__PostSingle->msgFmt = 1;
-
- _ns1__PostSingleResponse *ns1__PostSingleResponse = new _ns1__PostSingleResponse();
- int ret = proxy.PostSingle(ns1__PostSingle, *ns1__PostSingleResponse);
-
- soap_set_mode(&soap, SOAP_C_UTFSTRING);
- printf("ret=%d,ns1__PostSingleResponse->PostSingleResult=%d\n",ret,ns1__PostSingleResponse->PostSingleResult);
- }
4. 编译客户端
将gsoap安装包路径 /usr/tmp/gsoap-2.8/gsoap/下面的stdsoap2.cpp拷贝到sendMsg文件夹下
同时将gsoap安装路径 /usr/local/gSOAP/include下的stdsoap2.h拷贝到sendMsg文件夹下,之后的编译过程中会用到
编译源文件,这里一共四个源文件:
- g++ -c soapC.cpp soapWebServiceSoapBindingProxy.cpp stdsoap2.cpp sendMsg.cpp
- 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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。