目的:利用客户提供的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个文件:

[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

Logo

更多推荐