有人可以解释一下Document样式和RPC样式的Web服务之间的区别吗?
有两种通信样式模型,用于将WSDL绑定转换为SOAP消息主体。他们是:
文档和RPC
使用文档样式模型的优点是,只要SOAP消息主体的内容是任意XML实例,就可以根据需要构造SOAP主体。文档样式也称为面向消息的样式。
但是,使用RPC样式模型,SOAP请求主体的结构必须同时包含操作名称和方法参数集。RPC样式模型假定消息正文中包含的XML实例具有特定的结构。
此外,有两种编码使用模型,用于将WSDL绑定转换为SOAP消息。他们是: 文字和编码
使用文字使用模型时,正文内容应符合用户定义 XML-schema(XSD)结构。优点是双重的。首先,您可以使用用户定义的XML模式验证消息正文,此外,还可以使用XSLT之类的转换语言来转换消息。
带(SOAP) 编码的使用模型,消息必须使用XSD数据类型,但是消息的结构不必符合任何用户定义的XML模式。这使得难以验证消息正文或在消息正文上使用基于XSLT的转换。
不同样式和使用模型的组合为我们提供了四种将WSDL绑定转换为SOAP消息的方法。
Document/literal
Document/encoded
RPC/literal
RPC/encoded
我建议您阅读这篇标题为我应该使用哪种样式的WSDL的文章?由Russell Butek撰写,对不同样式和使用模型将WSDL绑定转换为SOAP消息以及它们的相对优缺点进行了很好的讨论。
一旦以两种通信方式接收到工件,我都会在端口上调用该方法。现在,这在RPC样式和Document样式上没有区别。那么有什么区别,区别在哪里可见?
可以找到差异的地方是“响应”!
RPC样式:
package com.sample;
import java.util.ArrayList;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
@WebService
@SOAPBinding(style=Style.RPC)
public interface StockPrice {
public String getStockPrice(String stockName);
public ArrayList getStockPriceList(ArrayList stockNameList);
}
用于第二个操作的SOAP消息将具有空输出,如下所示:
RPC样式响应:
<ns2:getStockPriceListResponse
xmlns:ns2="http://sample.com/">
<return/>
</ns2:getStockPriceListResponse>
</S:Body>
</S:Envelope>
文件样式:
package com.sample;
import java.util.ArrayList;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
@WebService
@SOAPBinding(style=Style.DOCUMENT)
public interface StockPrice {
public String getStockPrice(String stockName);
public ArrayList getStockPriceList(ArrayList stockNameList);
}
如果我们为上述SEI运行客户端,则输出为:
123 [123,456]
此输出表明ArrayList元素正在Web服务和客户端之间交换。仅通过更改SOAPBinding批注的style属性来完成此更改。下面显示了具有更丰富数据类型的第二种方法的SOAP消息,以供参考:
文件样式回应:
<ns2:getStockPriceListResponse
xmlns:ns2="http://sample.com/">
<return xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xsi:type="xs:string">123</return>
<return xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xsi:type="xs:string">456</return>
</ns2:getStockPriceListResponse>
</S:Body>
</S:Envelope>
结论
- 就像您在两条SOAP响应消息中已经注意到的那样,在DOCUMENT风格的情况下可以验证SOAP响应消息,而在RPC风格的Web服务中则不能。
- 使用RPC样式的基本缺点是它不支持更丰富的数据类型,而使用文档样式的是,它以XSD的形式带来了一些复杂的定义复杂数据类型的问题。
- 从这些操作中选择一种取决于操作/方法要求和预期的客户。
同样,HTTP上的SOAP与HTTP上的XML有何不同?毕竟SOAP也是带有SOAP名称空间的XML文档。那么,这里有什么区别?
为什么我们需要像SOAP这样的标准?通过在HTTP上交换XML文档,两个程序可以交换丰富的结构化信息,而无需引入其他标准(例如SOAP)来明确描述消息信封格式和对结构化内容进行编码的方式。
SOAP提供了一个标准,以便开发人员不必为要使用的每个服务发明一种自定义XML消息格式。给定要调用的服务方法的签名,SOAP规范规定了明确的XML消息格式。任何熟悉SOAP规范,使用任何编程语言工作的开发人员都可以为特定服务制定正确的SOAP XML请求,并通过获取以下服务详细信息来了解服务的响应。
- 服务名称
- 服务实现的方法名称
- 每种方法的方法签名
- 服务实现的地址(表示为URI)
使用SOAP可以简化将现有软件组件作为Web服务公开的过程,因为该服务的方法签名可以标识用于请求和响应的XML文档结构。