上篇博客中我们已经从宏观上介绍了WebService,以及WebService三大技术支持后台。
那我们这篇博客给大家介绍以下Soap以及WSDL的模样。首先从长相外表上了解一个事物,然后通过后期实践不断深入了解。嘻嘻,其实对人的了解何尝又不是呢?学习其实是与生活本来是想通的,很多学习的道理或方法都是来自生活。好啦,我们不感慨人生了,直奔这篇博客的主题。
?
SOAP是WebService消息传输的格式,我们运行一个程序时,只看到运行的结果是否符合我们的要求,其实背后又是如何运行的呢?那为了捕捉真实的逼真的消息,我们必须利用身边的工具,赤手空拳是无用的。
上篇博客中,我们介绍了两种调试捕捉消息的工具,其实若是在Eclispe中开发WebService的话,直接通过Eclispe也可以看到消息传递的。
Eclispe中,打开J2EE视图:
首先,把服务运行起来:
然后点击基于webservice的浏览器:
?
选择wsdl页面:
?
?
?
ws中两个方法:
?
点击任何一个函数,如添加方法:
?
点击source,以下是发送的和接受的消息:
?
通过我们捕捉soap消息,我们可以看出soap消息的组成部分。
soap消息可以形象地比喻:soap消息是一个信封。信中有信头,信主体。其中写信,当然,可以没有心头了(所谓的称谓),信主题必须要有,否则写这封信就没有意义了。
所以soap消息格式如下:
那代码格式的soap消息基本结构如下:
<?xml version="1.0"?>
< soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
< soap:Header>
...
...
< /soap:Header>
< soap:Body>
...
...
<soap:Fault>
...
...
</soap:Fault>
< /soap:Body>
< /soap:Envelope>
< soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
< soap:Header>
...
...
< /soap:Header>
< soap:Body>
...
...
<soap:Fault>
...
...
</soap:Fault>
< /soap:Body>
< /soap:Envelope>
?
其中,soap消息有一些注意的地方:
- SOAP 消息必须用 XML 来编码
- SOAP 消息必须使用 SOAP Envelope 命名空间
- SOAP 消息必须使用 SOAP Encoding 命名空间
- SOAP 消息不能包含 DTD 引用
- SOAP 消息不能包含 XML 处理指令
通过观察传递的soap消息,我们可以发现,不仅仅是传递的消息,在消息上部还有http协议信息。
发送的消息如下:在发送消息中,有发送的目的地Host,传送的字节数Content-Length,传送类型Content-type,字符编码charset
POST /ns HTTP/1.1
Content-type: text/xml;charset="utf-8"
Content-type: text/xml;charset="utf-8"
Host: 127.0.0.1:8880
Connection: keep-alive
Content-Length: 240
Connection: keep-alive
Content-Length: 240
?
?
接受的消息如下:在接受消息中,有接受的状态比如成功200(HTTP/1.1 200 OK)http协议传输的编码格式Transfer-encoding,传输类型Content-type
HTTP/1.1 200 OK
Transfer-encoding: chunked
Content-type: text/xml;charset="utf-8"
?
了解了Soap的格式规范,我们在编码时,会方便很多。用C++访问Java发布的webService时,就是使用的编写的Soap客户端,并且在Java服务器端,也是使用Soap形式发布服务的。
在后期博客中,我们会使用编写Soap形式在进行发布或访问服务,所以现在我们花点时间来了解一下Soap,嘻嘻,现在苦点,以后就会甜点。