初步选定从gsoap开始学。原因嘛,很简单,gsoap是开源的,而且网上资料也比较多,便于深入学习。gsoap的主页是 http://www.cs.fsu.edu/~engelen/soap.html,需要的话可以从这里下载。
网上倒是有不少资料,VCKbase上现成的代码也有一大堆,昨天找了一个,不过弄了半天也没有跑起来。后来直接看gsoap自带的samples里面,倒是有不少,应该是calc是最简单的,就从这个入手。进去了仔细看看,只有Makefile,再晕一下,只有重新下一个for Linux的版本。进入samples,直接make就可以了。好像在后面有个工程编译出错了,不过没关系,至少现在要用的calc是编出来了。编译出来有两个可执行文件,calcclient和calcserver。因为我现在用的TR069是客户端这边的,所以就先只看client。代码如下,倒是很简单。
#include "soapH.h" const char server[] = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi"; int main(int argc, char **argv) |
make的时候,调用了gsoap的工具soapcpp2,根据calc.h生成了一系列文件,应该就那个啥stun啥的。当然,这个只能针对两边平台都是C/C++的。如果是跨平台的,就要用到WSDL,可以用gsoap的工具wsdl2h,这个工具的wsdl是放在http://websrv.cs.fsu.edu/~engelen/calc.wsdl
之后直接在命令行运行./calcclient add 10 10,直接就返回了result = 20,非常方便。
使用抓包工具得到以下数据包:
POST /~engelen/calcserver.cgi HTTP/1.1
Host: websrv.cs.fsu.edu
User-Agent: gSOAP/2.7
Content-Type: text/xml; charset=utf-8
Content-Length: 448
Connection: close
SOAPAction: ""
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns="urn:calc">
<SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<ns:add>
<a>10</a>
<b>10</b>
</ns:add>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
HTTP/1.1 200 OK
Date: Thu, 24 Jan 2008 05:51:07 GMT
Server: Apache/2.0.52 (Scientific Linux)
Content-Length: 464
Connection: close
Content-Type: text/xml; charset=utf-8
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns="urn:calc">
<SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<ns:addResponse>
<result>20</result>
</ns:addResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
看懂了这两个数据包基本上就对SOAP有大致了解了,通讯使用的是HTTP协议,请求是用的POST,内容用xml进行表示。呵呵,SOAP真的很像Web,不过把用来显示的html换成了表示内容的xml。
SOAP的规范是SOAP-ENV在最外层,RPC方法在内层的Body内,都在ns内,返回值直接在方法名后加Response。