【问题标题】:What is the difference between Document style and RPC style communication?Document 风格和 RPC 风格的通信有什么区别?
【发布时间】:2012-02-22 03:57:10
【问题描述】:

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

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

收到工件后,在两种样式中,我都会调用端口上的方法。现在,这在 RPC 样式和 Document 样式中没有区别。那么有什么区别,区别在哪里?

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

【问题讨论】:

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


【解决方案1】:

有人可以解释一下文档样式和文档样式之间的区别吗? RPC 风格的网络服务?

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

使用 Document 样式模型的优点是,只要 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

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

一旦收到人工制品,在这两种沟通方式中,我 调用端口上的方法。现在,这在 RPC 风格上没有什么不同 和文档样式。那么有什么区别,那在哪里 区别可见吗?

你能发现区别的地方就是“RESPONSE”!

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 注释的样式属性来完成。数据类型更丰富的第二种方法的 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 样式但在 RPC 样式 Web 服务的情况下验证 SOAP 响应消息。
  • 基本的使用 RPC 样式的缺点是它没有 支持更丰富的数据类型,而使用 Document 样式的就是它 以 XSD 的形式带来了一些复杂性,用于定义更丰富的 数据类型。
  • 选择使用其中之一取决于 操作/方法要求和预期客户。

同样,SOAP over HTTP 与 XML over HTTP 有何不同?后 所有 SOAP 也是具有 SOAP 命名空间的 XML 文档。那么什么是 这里有什么不同?

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

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

  • 服务名称
  • 服务实现的方法名称
  • 每个方法的方法签名
  • 服务实现的地址(以 URI 表示)

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

【讨论】:

  • 特别感谢“我应该使用哪种风格的 WSDL?”文章链接。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    • 优势
      • 使用这种文档样式,我们可以根据预定义的模式验证 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 中将提供类型部分

    【讨论】:

    • 只是重复了参考中的内容。这种解释并没有帮助我理解差异。
    • 这肯定不是来自参考或文档——它充满了语法错误
    【解决方案4】:

    JAX-WS RPCDocument样式使用的主要场景如下:

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

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

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

    【讨论】:

      【解决方案5】:

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

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

      此外,在 Document Literal 中,要调用的操作没有根据其名称指定,而在 Wrapped 中,它是。我认为,在轻松找出请求所针对的操作名称方面,这是一个显着的区别。

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

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

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

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

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

      【讨论】:

        【解决方案6】:

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

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

        文档样式soap正文消息示例

          <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 甚至没有类型部分来定义和约束参数

        文字 默认样式。数据根据模式进行序列化,数据类型未在消息中指定,但对模式(命名空间)的引用用于构建soap消息。

           <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>
        

        无架构

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-12-09
          • 2013-01-03
          • 2011-10-24
          • 2011-04-26
          • 1970-01-01
          • 2012-09-08
          • 1970-01-01
          相关资源
          最近更新 更多