Linux下 C/C++ Web Service开发(gsoap + wsdl 生成客户端)
目的:利用客户提供的wsdl地址,实现一个短信发送接口。实现思路:在Linux环境中,利用gsoap工具生成客户端框架。实现环境:系统环境:Centos6.4gsoap:gsoap2.8.66一、环境配置1. 安装gsoap安装流程:https://blog.csdn.net/g1269420003/article/details/8131...
目的:利用客户提供的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
更多推荐
所有评论(0)