文档样式和RPC样式通信有什么区别?


92

有人可以向我解释一下Document和RPC样式的Web服务之间的区别吗?除了JAX-RPC,下一版本是JAX-WS,它同时支持Document和RPC样式。我也了解文档样式的Web服务是用于异步通信的,在这种情况下,客户端不会阻塞,直到收到响应为止。

无论哪种方式,我目前都使用JAX-WS用@Webservice注释服务。,生成WSDL,然后从该WSDL中生成客户端构件。

一旦收到了两种样式的工件,我就在端口上调用该方法。现在,这在RPC样式和Document样式上没有区别。那么有什么区别,区别在哪里可见?

同样,HTTP上的SOAP与HTTP上的XML有什么不同?毕竟SOAP也是带有SOAP名称空间的XML文档。


Answers:


97

有人可以解释一下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文档结构。


特别感谢“我应该使用哪种样式的WSDL?” 文章链接。
Boolean_Type


20

在WSDL定义中,绑定包含操作,每种操作都有样式。

Document:在WSDL文件中,它指定具有内联或导入XSD文档的类型详细信息,该文档描述了那些松散耦合的服务方法正在交换的复杂数据类型的结构(即模式)。文档样式是默认样式。

  • 优势
    • 使用此文档样式,我们可以针对预定义的模式来验证SOAP消息。它支持xml数据类型和模式。
    • 松散耦合。
  • 缺点:有点难以理解。

在WSDL types中,元素如下所示:

<types>
 <xsd:schema>
  <xsd:import schemaLocation="http://localhost:9999/ws/hello?xsd=1" namespace="http://ws.peter.com/"/>
 </xsd:schema>
</types>

该架构是从外部引用导入的。

RPC:在WSDL文件中,它不创建类型架构,而是在消息元素内定义名称和类型属性,以使其紧密耦合。

<types/>  
<message name="getHelloWorldAsString">  
<part name="arg0" type="xsd:string"/>  
</message>  
<message name="getHelloWorldAsStringResponse">  
<part name="return" type="xsd:string"/>  
</message>  
  • 优点:易于理解。
  • 缺点
    • 我们无法验证SOAP消息。
    • 紧密耦合

RPC: WSDL中没有类型的
文档: WSDL中的类型”部分不可用


只是重复参考中的内容。这种解释并没有帮助我理解差异。
kinunt

1
这肯定不是来自参考文献或文档-充满语法错误
specializt

7

使用JAX-WS RPC文档样式的主要方案 如下:

  • 远程过程调用(RPC)当消费者观看Web服务作为一个单一的逻辑应用程序或组件与封装的数据被用于图案。请求和响应消息直接映射到过程调用的输入和输出参数。

    RPC模式的此类示例可能包括付款服务或股票报价服务。

  • 基于文档的模式是在消费者观看Web服务作为一个较长的运行的业务流程,其中请求文件是一个完整的信息单元的情况下使用。这种类型的Web服务可能涉及人机交互,例如,与信用申请请求文档和包含来自贷款机构的投标的响应文档一样。因为运行时间较长的业务流程可能无法立即返回所请求的文档,所以基于文档的模式更常见于异步通信体系结构中。SOAP的Document / literal版本用于实现基于文档的Web服务模式。


3

我认为您要问的是RPC Literal,Document Literal和Document Wrapped SOAP Web服务之间的区别。

请注意,Document Web服务也分为文字和包装形式,它们是不同的-主要区别之一是后者符合BP 1.1,而前者则不。

同样,在Document Literal中,未根据名称来指定要调用的操作,而在Wrapped中,则是指定名称。我认为,就轻松确定请求所针对的操作名称而言,这是一个重大区别。

就RPC文字还是文档包装而言,可以很容易地根据WSDL中的模式对文档包装请求进行审核/验证-这是一大优势。

由于其优势,我建议使用“文档包装”作为选择的Web服务类型。

HTTP上的SOAP是绑定到HTTP作为载体的SOAP协议。SOAP也可以通过SMTP或XXX。SOAP提供了一种实体(例如,客户端和服务器)之间交互的方式,并且两个实体都可以根据协议的语义来封送操作参数/返回值。

如果您正在(并且可以)通过HTTP使用XML,则可以简单地将其理解为HTTP请求/响应上的XML有效负载。您将需要提供封送/解封,错误处理等框架。

带有WSDL和代码示例的详细教程,重点放在Java:SOAP和JAX-WS,RPC与文档Web服务


2

文档
文档样式消息可以根据预定义的架构进行验证。以文档样式,SOAP消息作为单个文档发送。模式示例:

  <types>  
   <xsd:schema> <xsd:import namespace="http://example.com/" 
    schemaLocation="http://localhost:8080/ws/hello?xsd=1"/>  
   </xsd:schema>  
  </types>

文档样式肥皂正文消息的示例

  <message name="getHelloWorldAsString">   
     <part name="parameters" element="tns:getHelloWorldAsString"/>   
  </message> 
  <message name="getHelloWorldAsStringResponse">  
     <part name="parameters"> element="tns:getHelloWorldAsStringResponse"/>   
  </message>

文档样式消息是松散耦合的。

RPC RPC样式消息使用方法名称和参数来生成XML结构。消息很难根据架构进行验证。在RPC样式中,发送的SOAP消息与许多元素一样。

  <message name="getHelloWorldAsString">
    <part name="arg0"> type="xsd:string"/>   
   </message> 
  <message name="getHelloWorldAsStringResponse">   
    <part name="return"
   > type="xsd:string"/>   
  </message>

这里每个参数都是离散指定的,RPC样式消息是紧密耦合的,通常是静态的,当方法签名更改时需要更改客户端。rpc样式仅限于非常简单的XSD类型,例如String和Integer,而生成的WSDL不会甚至有一个类型部分来定义和约束参数

文字 默认样式。数据是根据模式序列化的,数据类型不是在消息中指定的,而是使用对schema(namespace)的引用来构建肥皂消息。

   <soap:body>
     <myMethod>
        <x>5</x>
        <y>5.0</y>
     </myMethod>
   </soap:body>

每个参数中指定的编码数据类型

   <soap:body>
     <myMethod>
         <x xsi:type="xsd:int">5</x>
         <y xsi:type="xsd:float">5.0</y>
     </myMethod>
   </soap:body>

无架构

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.