概述
介绍SOAP报文的结构,以及获取的方式。
正文
1.其实发送的是SOAP消息
在前面讲述过使用Eclipse的工具Web Services Explorer发送请求。在Actions中填写请求参数,然后点击Go发送请求。其实发送出去的是对应的SOAP消息:
![](https://images2015.cnblogs.com/blog/721161/201602/721161-20160217170553925-1167922897.png)
点击Source链接,可以看到一个预设的SOAP消息框架:
![](https://images2015.cnblogs.com/blog/721161/201602/721161-20160217170554425-1609780607.png)
注:为了突出重点,做了适当的调整;大家在实际操作时看到应该不同。
在文本框之外的,是SOAP框架的元素;在文本框之内的,是我们自定义的元素。我们可以直接编辑自定义的部分,但是要符合wsdl文档中对于元素的定义。
假如我们这样编辑:
![](https://images2015.cnblogs.com/blog/721161/201602/721161-20160217170555066-2141360896.png)
我们可以直接点击Go发送请求,或者点击Form,回到一般的参数编辑页面(会有一个确认框,直接确认即可):
![](https://images2015.cnblogs.com/blog/721161/201602/721161-20160217170555691-119086621.png)
2. 如何获取SOAP消息的结构
以服务端的思考中发布的服务为例,wsdl的地址是http://localhost:6666/service/interpret?wsdl,使用浏览器访问,可以看到:
![](https://images2015.cnblogs.com/blog/721161/201602/721161-20160217170556488-1640665652.png)
先把关注点放在红框中,那里引入了一个Schema,这个Schema定义了SOAP消息中的,自定义部分的结构。使用浏览器打开那个地址,可以看到:
![](https://images2015.cnblogs.com/blog/721161/201602/721161-20160217170557066-1015790598.png)
假设你已经对Schema的知识有了一定的了解,如果不是,可以参考:w3school XML Schema 参考手册。
上述的Schema定义了两个结构:
<tns:interpret xmlns:tns="http://service.chapter1.jws.sand.ljl.cn/"> <num/> </tns:interpret>
和
<tns:interpretResponse xmlns:tns="http://service.chapter1.jws.sand.ljl.cn/"> <chnum/> </tns:interpretResponse>
一个是请求消息的Body结构,一个是响应消息的Body结构。那么如何对号入座呢?不可避免的还是要讲一些wsdl的内容,以下内容仅是自己的理解,不敢保证在严格的领域被认可。
wsdl包含五个部分,前三个部分依次是types、message、portType,其各作用如下:
- types
定义SOAP消息的结构,例如上文中是通过引入了外部的Schema来定义 - message
对types中的结构进行了封装,每一个结构作为message的一个part - portType
定义服务操作(operation),以及每一个操作的输入、输出及对应的message。
通过这三个部分,我们就可以完全确定SOAP报文的结构了,对号入座的关键在于解读portType。
那么我们现在看一下上文的wsdl的这三个部分:
![](https://images2015.cnblogs.com/blog/721161/201602/721161-20160217170557550-1138488366.png)
请尝试自己解读。
既然wsdl的前三个部分已经可以确定报文的结构,那么后面的两个部分binding、service应该是侧重于协议的描述;也因此,我把前三个部分称为结构相关,把后两个部分称为协议相关,而后者目前还不打算讲。