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

时间:2012-01-30 10:31:33

标签: web-services soap wsdl jax-ws rpc

有人可以向我解释Document和RPC风格的webservices之间的区别吗?除了JAX-RPC之外,下一个版本是JAX-WS,它支持Document和RPC样式。我也理解文档样式的webservices是用于异步通信的,客户端在收到响应之前不会阻塞。

无论哪种方式,使用JAX-WS我当前使用 @Webservice 注释服务,生成WSDL,并从该WSDL生成客户端工件。

一旦收到工件,在两种样式中,我都会调用端口上的方法。现在,这在RPC样式和文档样式上没有区别。那么差异是什么呢?可见差异在哪里?

同样,SOAP over HTTP与HTTP上的XML有何不同?毕竟SOAP也是带有SOAP命名空间的XML文档。

6 个答案:

答案 0 :(得分:90)

  

有些机构可以解释一下文档样式和文档之间的区别   RPC样式的webservices?

有两种通信样式模型用于将WSDL绑定转换为SOAP消息体。他们是:  文件& RPC

使用文档样式模型优点是,只要SOAP消息体的内容是任意XML实例,您就可以以任何方式构造SOAP体。文档样式也称为 面向消息的样式

但是,对于 RPC样式模型,SOAP请求正文的结构必须包含操作名称和方法参数集。 RPC样式模型假定消息正文中包含的 XML实例 的特定结构。

此外,有两种编码使用模型,用于将WSDL绑定转换为SOAP消息。它们是:文字,编码

使用文字使用模型时,正文内容应符合用户定义的 XML架构(XSD)结构。优点是双重的。例如,您可以使用用户定义的XML模式验证消息体,此外,您还可以使用XSLT等转换语言转换消息。

使用(SOAP)编码的使用模型,消息必须使用XSD数据类型,但消息的结构不必符合任何用户定义的XML模式。这使得很难验证消息体或在消息体上使用基于XSLT的转换。

不同样式和使用模型的组合为我们提供了四种不同的方式将WSDL绑定转换为SOAP消息。

Document/literal
Document/encoded
RPC/literal
RPC/encoded

我建议您阅读Russell Butek撰写的题为Which style of WSDL should I use?的文章,该文章讨论了将WSDL绑定转换为SOAP消息的不同样式和使用模型,以及它们的相对优势和劣势。

  

一旦收到文物,在两种沟通方式中,我   在端口上调用方法。现在,这在RPC风格上没有区别   和文档样式。那有什么区别,那是什么呢   差异可见吗?

您可以找到差异的地方是"响应"!

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]

此输出显示在Web服务和客户端之间交换ArrayList元素。此更改仅通过更改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样式的基本缺点是它没有 支持更丰富的数据类型和使用Document样式的数据类型就是它 以XSD的形式带来一些复杂性来定义更丰富的 数据类型。
  • 使用其中一种的选择取决于 操作/方法要求和预期的客户。
  

同样,SOAP over HTTP与HTTP上的XML有何不同?后   所有SOAP都是带有SOAP命名空间的XML文档。那是什么呢?   差异在哪里?

为什么我们需要像SOAP这样的标准?通过HTTP交换XML文档,两个程序可以交换丰富的结构化信息,而无需引入额外的标准(如SOAP)来明确描述消息信封格式和编码结构化内容的方法。

SOAP提供了一个标准,因此开发人员不必为他们想要提供的每个服务创建自定义XML消息格式。给定要调用的服务方法的签名,SOAP规范规定了明确的XML消息格式。任何熟悉SOAP规范的开发人员,使用任何编程语言,都可以为特定服务制定正确的SOAP XML请求,并通过获取以下服务详细信息来了解服务的响应。

  • 服务名称
  • 服务实施的方法名称
  • 每种方法的方法签名
  • 服务实现的地址(表示为URI)

使用SOAP简化了将现有软件组件公开为Web服务的过程,因为服务的方法签名标识了用于请求和响应的XML文档结构。

答案 1 :(得分:23)

RPC样式的Web服务使用方法的名称及其参数来生成表示方法调用堆栈的XML结构。文档样式表示SOAP正文包含一个XML文档,可以根据预定义的XML模式文档进行验证。

一个很好的起点:SOAP Binding: Difference between Document and RPC Style Web Services

答案 2 :(得分:17)

在WSDL定义中,绑定包含操作,这里是每个操作的样式。

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

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

在WSDL类型中,元素如下所示:

<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中提供

答案 3 :(得分:7)

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

  • 当使用者将Web服务视为具有封装数据的单个逻辑应用程序或组件时,将使用远程过程调用(RPC)模式。请求和响应消息直接映射到过程调用的输入和输出参数。

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

  • 基于文档的模式用于消费者将Web服务视为较长时间运行的业务流程的情况,其中请求文档表示完整的信息单元。这种类型的网络服务可能涉及用于示例的人工交互,如同具有包含来自贷款机构的投标的响应文档的信用申请请求文档。由于较长时间运行的业务流程可能无法立即返回所请求的文档,因此基于文档的模式更常见于异步通信体系结构中。 SOAP的Document / literal变体用于实现基于文档的Web服务模式。

答案 4 :(得分:3)

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

请注意,文档Web服务被描述为文字和包装,它们是不同的 - 其中一个主要区别是后者符合BP 1.1而前者不符合。

此外,在Document Literal中,要调用的操作不是根据其名称指定的,而在Wrapped中,它是。我认为,这在容易确定请求所针对的操作名称方面存在显着差异。

就RPC文字与文档包装而言,可以根据WSDL中的模式轻松审查/验证Document Wrapped请求 - 这是一个很大的优势。

由于其优势,我建议使用Document Wrapped作为Web服务类型。

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

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

详细的教程,包含强调Java的WSDL和代码示例:SOAP and JAX-WS, RPC versus Document Web Services

答案 5 :(得分:1)

文档
 可以根据预定义的架构来验证文档样式消息。  以文档样式,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>

免费架构