Web Services 文档样式与RPC样式通信之间有何区别?

7eumitmz  于 2022-11-15  发布在  其他
关注(0)|答案(6)|浏览(132)

有人能给我解释一下文档和RPC风格的Web服务之间的区别吗?除了JAX-RPC,下一个版本是JAX-WS,它同时支持文档和RPC风格。我还知道文档风格的Web服务是用于异步通信的,客户端在收到响应之前不会阻塞。
无论采用哪种方式,我目前都使用JAX-WS用 @Webservice 注解服务,生成WSDL,并从该WSDL生成客户端工件。
一旦接收到工件,在两种样式中,我调用端口上的方法。现在,这在RPC样式和Document样式中没有区别。那么,区别是什么?在哪里可以看到区别?
同样,SOAP over HTTP与XML over HTTP有什么不同?毕竟SOAP也是具有SOAP命名空间的XML文档。

dw1jzc5e

dw1jzc5e1#

有人能解释一下文档样式和RPC样式Web服务之间的区别吗?
有两种通信样式模型可用于将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样式和Document样式中没有区别。那么,区别是什么?区别在哪里?
你能发现不同之处的地方是“React”!

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的客户端,输出为:
第一百二十三章【一百二十三,四百五十六】
此输出显示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样式的基本缺点是它不支持更丰富的数据类型,而使用Document样式的缺点是它以XSD的形式为定义更丰富的数据类型带来了一些复杂性。
  • 根据操作/方法要求和预期客户选择使用其中之一。

同样,SOAP over HTTP和XML over HTTP有什么不同?毕竟SOAP也是XML文档,有SOAP命名空间。那么这里有什么不同呢?
为什么我们需要SOAP这样的标准?通过在HTTP上交换XML文档,两个程序可以交换丰富的结构化信息,而无需引入其他标准(如SOAP)来显式描述消息信封格式和对结构化内容进行编码的方式。
SOAP提供了一个标准,这样开发人员就不必为他们希望提供的每个服务都发明一个自定义的XML消息格式。给定要调用的服务方法的签名,SOAP规范规定了一个明确的XML消息格式。任何熟悉SOAP规范的开发人员,使用任何编程语言,可以为特定服务制定正确的SOAP XML请求,并通过获取以下服务详细信息来了解来自服务的响应。

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

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

nxagd54h

nxagd54h2#

RPC样式Web服务使用方法的名称及其参数来生成表示方法调用堆栈的XML结构。文档样式指示SOAP正文包含可根据预定义的XML架构文档进行验证的XML文档。
一个良好的起点:SOAP Binding: Difference between Document and RPC Style Web Services

cpjpxq1n

cpjpxq1n3#

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

**文档:**在WSDL文件中,它指定具有内联或导入XSD文档的类型详细信息,该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中可用
1mrurvl1

1mrurvl14#

使用JAX-WSRPCDocument样式的主要方案如下:

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

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

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

pxiryf3j

pxiryf3j5#

我想你问的是RPC文字、文档文字和文档 Package SOAP Web服务之间的区别。
请注意,文档Web服务也被描述为文字和 Package ,它们是不同的-主要区别之一是后者符合BP 1.1,而前者不符合。
另外,在Document Literal中,调用的操作不是根据其名称指定的,而在Wrapped中,是根据其名称指定的。我认为,这是一个很大的区别,可以很容易地找出请求所针对的操作名称。
就RPC文字与文档 Package 而言,文档 Package 请求可以很容易地根据WSDL中的模式进行审查/验证-这是一个很大的优势。
我建议使用文档 Package 作为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

3hvapo4f

3hvapo4f6#

文件

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

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

RPCRPC样式消息使用方法名称和参数来生成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甚至没有用于定义和约束参数的类型部分

Literal默认样式。数据根据架构序列化,消息中未指定数据类型,但使用对架构(命名空间)的引用来生成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>

架构空闲

相关问题