前面一篇记录了SOAP协议的基本概念,这一篇就讲一下c语言开发选手如何使用SOAP协议提供的丰富RPC接口。
目前来看,最傻瓜的是字节封装SOAP协议报文,利用模拟http请求,发送报文,然后接收应答,自己解析那些响应中的xml文件,拿到自己需要的结果
这种方式仅仅适合于对http模拟十分熟悉,并且擅长解析xml,且需求量很少的选手。
下面推荐一组成熟方案,可方便的将WSDL接口,转化为c语言的文件,直接包含在自己的项目中,然后直接调用里面的c语言接口,取回返回值。
使用到的软件叫gsoap,在centos下面安装十分简单
yum install gsoap-*
会安装上gsoap的开发工具和库文件,我机上安装的是:
gsoap-devel-2.8.16-12.el7.x86_64
gsoap-doc-2.8.16-12.el7.noarch
gsoap-2.8.16-12.el7.x86_64
软件提供了两个关键命令wsdl2h和soapcpp2
wsdl2h
顾名思义啊,WSDL转化为.h文件
soapcpp2
生成soap协议的c语言接口
下面简单以前一篇文章的查询手机号归属地来举个例子,首先,利用wsdl2h命令,生成头文件
wsdl2h -P -x -c -s -t typemap.dat -o phone.h http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl
然后目录下回生成phone.h这个文件,其实这个文件最终并不需要编译使用,而是用来生成c文件的中间文件
然后生成c文件
soapcpp2 -2 -C -L -c -x phone.h
此时目录下就有了如下文件
到此为止,gsoap的工作就完成了。我们来看一下最终的接口,就在soapStub.h中,原型在soapClient.c中。
以获取归属地为例
接口为
SOAP_FMAC5 int SOAP_FMAC6 soap_call___ns1__getMobileCodeInfo_(struct soap *soap, const char *soap_endpoint, const char *soap_action, struct _ns1__getMobileCodeInfo *ns1__getMobileCodeInfo, struct _ns1__getMobileCodeInfoResponse *ns1__getMobileCodeInfoResponse)
简单协议个c语言的主函数,然后就可以调用了
#include "soapH.h"
#include "soapStub.h"
#include "MobileCodeWSSoap.nsmap"
int main()
{
struct soap add_soap;
soap_init(&add_soap);
struct _ns1__getMobileCodeInfo ns1__getMobileCodeInfo;
struct _ns1__getMobileCodeInfoResponse ns1__getMobileCodeInfoResponse;
soap_set_mode(&add_soap,SOAP_C_UTFSTRING);
ns1__getMobileCodeInfo.mobileCode="13683612111";
ns1__getMobileCodeInfo.userID="";
if(soap_call___ns1__getMobileCodeInfo_(&add_soap, NULL, NULL,&ns1__getMobileCodeInfo, &ns1__getMobileCodeInfoResponse)== SOAP_OK)
{
printf("Response:[%s]\n", ns1__getMobileCodeInfoResponse.getMobileCodeInfoResult);
}
else
{
printf("soap error:%d,%s,%s\n", add_soap.error, *soap_faultcode(&add_soap), *soap_faultstring(&add_soap) );
}
soap_end(&add_soap);
soap_done(&add_soap);
return 0;
}
这个文件与前面的c文件编译到一起,并且连接lgsoap库,即可运行
[root@localhost phone]# ./phone
Response:[13683612111:北京 北京 北京移动神州行卡]
是不是很easy?
好像这个软件还能生成服务端的代码呢,网上找到的各种支持,看起来还是很有嚼头
C/C++数据绑定工具,支持XML-RPCfrom/to JSON from/to C/C++ serialization
支持WSDL 1.1,2.0, SOAP 1.1, 1.2
支持REST HTTP(S) 1.0/1.1 operations (GET,PUT,POST etc) for XML, JSON,etc
支持MIME and MTOM 附件
支持IPv4,IPv6, TCP 和UDP
支持CGI,FastCGI
支持嵌入到Apache,IIS中发布
自带了一个Web server (multithreaded, SSL, compression)用于发布
可适用于WinCE, Palm, Symbian, VxWorks, Andriod, iPhone等小设备
…(拣主要的,其余忽略)
不过今天就不嚼了,该放假了,用肚子的地方还多着呢
回想起来,年轻时候要有这么爱学习,何愁工作不理想呢?
所以还是奉劝所有看到这些的年轻人,好好学习,为的是有好工作;
中年人也要好好学习,希望三十五岁后还有人用;
网络协议学习–SOAP协议(一)