SOAP入门

 学习SOAP的原因很简单,最近在看TR069,是基于SOAP的,没办法,就来看看这个东西。


      初步选定从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"
#include "calc.nsmap"

const char server[] = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi";

int main(int argc, char **argv)
{ struct soap soap;
  double a, b, result;
  if (argc < 4)
  { fprintf(stderr, "Usage: [add|sub|mul|div|pow] num num/n");
    exit(0);
  }
  soap_init(&soap);
  a = strtod(argv[2], NULL);
  b = strtod(argv[3], NULL);
  switch (*argv[1])
  { case 'a':
      soap_call_ns__add(&soap, server, "", a, b, &result);
      break;
    case 's':
      soap_call_ns__sub(&soap, server, "", a, b, &result);
      break;
    case 'm':
      soap_call_ns__mul(&soap, server, "", a, b, &result);
      break;
    case 'd':
      soap_call_ns__div(&soap, server, "", a, b, &result);
      break;
    case 'p':
      soap_call_ns__pow(&soap, server, "", a, b, &result);
      break;
    default:
      fprintf(stderr, "Unknown command/n");
      exit(0);
  }
  if (soap.error)
  { soap_print_fault(&soap, stderr);
    exit(1);
  }
  else
    printf("result = %g/n", result);
  soap_destroy(&soap);
  soap_end(&soap);
  soap_done(&soap);
  return 0;
}


      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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值