(接上篇,本文给出gSOAP的实例,gSOAP的版本为2.8.8)
四、应用实例
上节介绍了gSOAP的应用有两种,大部分介绍gSOAP的文章,都以第一种为主,其实第二种应用包含了第一种,所以文本只介绍第二种应用。
本文的例子中,前提是通讯协议(格式)已定,webservice名已定,我们需要自己编写xml schema及wsdl文件。
1.xml schema
这部分内容不属于本文范围,其实,对xml schema和wsdl编写,最好的办法就是找一个接近的例子,修改一下来满足我们的要求。
2.wsdl
一个wsdl通常由如下部分组成:
<wsdl:definitions>
<wsdl:types/>
<wsdl:message/>
<wsdl:portType/>
<wsdl:binding/>
<wsdl:service/>
</wsdl:definitions>
其中
- types也就是通讯内容的格式(上面的xml schema),一般情况下,所有的类型最终被包含到一个复杂类型中,作为下面message中数据包引用的类型;
- message定义了通讯的数据包(通讯一般是双向的,因此,一个调用过程有两个message定义,一般情况下用<methodname>in和<methodname>out分别表示进入和发出服务器的数据包),该数据包引用了上面types中的最终的复杂类型;
- portType包含了若干operation(对应于代码实现中的method),定义了该operation进出的message;
- binding是对上面operation的网络描述,也就是将operation与某一可以用soap形式进行网络访问的方式“绑定”在一起,binding指明了每个method的访问地址和方式。
- service是对整个web服务的描述(访问地址等)。
wsdl的定义是从小到大,一层一层的,从外部调用的角度来看,却是从大到小,由下往上理解:先有service,再有method(portType中的operation),然后有message,最后才有各种内容类型定义(schema),我们最终操作的起点与终点就是构造/解析这些类型。
3.生成.h
由wsdl生成.h文件,使用的工具是wsdl2h,该工具的各种运行选项,见作者上篇文章。为使代码简洁,我们一般情况下需要采用如下的选项:
- 允许stl类型(不加-s)
- 产生typedef定义(加-y)<