|
七:SOAP
1:简单的soap示例
- <?xml version='1.0' ?>
- <env:Envelope xmlns:env="ht tp://ww w.w3.org/2003/05/SOAP-envelope">
- <env:Header>
- </env:Header>
- <env:Body>
- <cms:getNumberOfArticles xmlns:cms="ht tp://w ww.daily-moon.com/cms">
- <cms:category>classifieds</cms:category>
- <cms:subcategory>forsale</cms:subcategory>
- </cms:getNumberOfArticles>
- </env:Body>
- </env:Envelope>
复制代码 2:soap信封
Web 服务消息的基本单元是实际的 SOAP 信封。这是包含处理消息所必需的所有信息的 XML 文档
- <?xml version='1.0' ?>
- <env:Envelope xmlns:env="ht tp://w ww.w3.org/2003/05/SOAP-envelope">
- <env:Header>
- </env:Header>
- <env:Body>
- </env:Body>
- </env:Envelope>[code]
- 3:soap的Header
- SOAP 消息中的 Header 用于提供有关消息本身的信息,与用于应用程序的信息相对。例如,Header 可以包括路由信息
- [code]
- <?xml version='1.0' ?>
- <env:Envelope xmlns:env="ht tp://ww w.w3.org/2003/05/SOAP-envelope">
- <env:Header>
- <wsa:ReplyTo xmlns:wsa=
- "ht tp://schemas.xmlSOAP.org/ws/2004/08/addressing">
- <wsa:Address>
- ht tp://schemas.xmlSOAP.org/ws/2004/08/addressing/role/anonymous
- </wsa:Address>
- </wsa:ReplyTo>
- <wsa:From>
- <wsa:Address>
- h ttp://localhost:8080/axis2/services/MyService</wsa:Address>
- </wsa:From>
- <wsa:MessageID>ECE5B3F187F29D28BC11433905662036</wsa:MessageID>
- </env:Header>
- <env:Body>
- </env:Body>
- </env:Envelope>
复制代码 本例中有一个 WS-Addressing 元素,其中包含有关消息将送达何处以及应将应答送达何处的信息。Header 可包含关于消息本身的所有类型的消息。事实上,SOAP 规范中使用了大量篇幅说明哪些元素可以放入 Header以及应由“SOAP 中间层”如何对其进行处理。也就是说,SOAP 规范并不假定消息将直接从一个点传递到另一个点(从客户机到服务器)。
规范考虑了 SOAP 消息在送达最终目的地的过程中可能实际由多个中间层处理的情况,很清楚地说明了中间层应如何对待在 Header 中找到的信息。不过,对此的讨论不在本教程的范围之内。因此,目前只要知道 Header 可以提供许许多多的功能(如果您需要)即可。
4:soap的Body
发送 SOAP 消息时,都是有目的性的。您在尝试告诉接收者执行某种操作,或尝试向服务器传递相关信息。此信息称为“有效负载”。有效负载位于 Envelope 的 Body 中。它还具有自己的命名空间,在本例中其命名空间与内容管理系统对应。在此情况下,可以完全随意地选择命名空间。只需要与 SOAP 命名空间相异即可
- <?xml version='1.0' ?>
- <env:Envelope xmlns:env="ht tp://w ww.w3.org/2003/05/SOAP-envelope">
- <env:Header>
- ...
- </env:Header>
- <env:Body>
- <cms:addArticle xmlns:cms="ht tp://w ww.daily-moon.com/cms">
- <cms:category>classifieds</category>
- <cms:subcategory>forsale</cms:subcategory>
- <cms:articleHeadline></cms:articleHeadline>
- <cms:articleText>Vintage 1963 T-Bird. Less than 300 miles.
- Driven by my daughter until I took it away. Serious inquires only.
- 555-3264 after 7 PM.</cms:articleText>
- </cms:addArticle>
- </env:Body>
- </env:Envelope>
复制代码 在此例中,有效负载很简单,其中包含将文章添加到 Daily Moon 的内容管理系统的指令。
4:样式和编码
这个主要是在WSDL(Web服务描述语言)中讲述。
简单来说,有两种不同的主流 SOAP消息编程样式。第一种是 RPC 样式,基于使用 SOAP 消息创建远程过程调用(Remote Procedure Call)的概念。在此样式中,基本思路是在向服务器发送命令(如“添加文章”),并将该命令的参数(如要添加的文章和应该添加到的类别)作为整个方法的子元素包含在其中
- <env:Envelope xmlns:env="ht tp://w ww.w3.org/2003/05/SOAP-envelope">
- <env:Header>
复制代码 RPC 样式的替代方法将数据直接作为 SOAP 体的内容处理,并在应用服务器对消息进行路由的信息中包含有关其所属的过程或函数的信息
- <env:Envelope xmlns:env="ht tp://ww w.w3.org/2003/05/SOAP-envelope">
- <env:Header>
- </env:Header>
- <env:Body>
- <cms:addArticle xmlns:cms="h ttp://w ww.daily-moon.com/cms">
- <cms:category>classifieds</category>
- <cms:subcategory>forsale</cms:subcategory>
- <cms:articleHeadline></cms:articleHeadline>
- <cms:articleText>Vintage 1963 T-Bird. Less than 300
- miles. Driven by my daughter until I took it away.
- Serious inquires only. 555-3264 after 7 PM.</cms:articleText>
- </cms:addArticle>
- </env:Body>
- </env:Envelope>
复制代码 第二个样式称为 document/literal 样式,即将相应的数据直接添加到消息中
- <?xml version='1.0' ?>
- <env:Envelope xmlns:env="ht tp://w ww.w3.org/2003/05/SOAP-envelope">
- <env:Header>
- </env:Header>
- <env:Body>
- <category>classifieds</category>
- <subcategory>forsale</subcategory>
- <articleHeadline></articleHeadline>
- <articleText>Vintage 1963 T-Bird. Less than 300 miles.
- Driven by my daughter until I took it away. Serious
- inquires only. 555-3264 after 7 PM.</articleText>
- </env:Body>
- </env:Envelope>
复制代码 在这种情况下,消息本身并不包含有关数据所提交到的进程的信息,此工作由路由软件进行。例如,所有对特定 URL 或端点的调用都可能指向特定的操作。另外,从技术上讲,可以使用 document/encoded 样式,但目前还没有人这样做,因此可以将其忽略。
5:消息交换模式
发送消息,就实质而言,只有两个选择:
请求/响应:在请求/响应模式种,以 SOAP 消息的形式发送请求,然后直接等待发送回响应。请求可以为同步的,也可以是异步的。
单向消息传递:这种情况也称为“Fire and Forget”方法,发送请求但并不等待响应。可以在仅传递信息时或并不关心接收者对此如何响应时使用此方法。
【终于完了!!】
|
|