Web服务:Wrapped vs Bare - 来自Java Web Services的启动和运行

时间:2013-01-01 02:37:27

标签: java web-services

我是webservice的新手,并阅读了“Java WebServices Up and Running”一书。不知何故,我觉得这对初学者来说有点混乱。在第54页,它是相互矛盾的陈述。

首先它说

  

在展开的样式中,参数出现裸露;就是说,作为一个       SOAP主体中未展开的XML子元素序列。在包裹的风格,       参数作为带有名称的XML元素的包装XML子元素发生       服务操作

然后它说。

  

可能令人惊讶的是底层SOAP消息的结构       请求和响应保持不变。例如,请求消息       从简化的客户端,AmazonClientU在结构上与请求消息相同       来自复杂的客户端AmazonClientW。

我尝试编写示例程序,我清楚地看到Wrapped Style和Bare风格的SOAP消息之间的区别。 Bare样式不包含SOAP正文中的操作名称。

有人请澄清。提前谢谢..

3 个答案:

答案 0 :(得分:2)

Java Ranch论坛的

This discussion为我清除了它。特别是这个例子由 Jason Irwin

制作

BARE 客户端生成的界面(使用wsimport):

@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)  
public interface IMathServer {  
    @WebMethod  
    @WebResult(name = "addNumsResponse")  
    public AddNumsResponse addNums(@WebParam(name = "addNums") AddNums parameters);  
}  

WRAPPED 客户端生成的界面(使用wsimport):

@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.WRAPPED)  
public interface IMathServer {  
    @WebMethod  
    @WebResult(name = "addNumsResponse")  
    public int addNums(@WebParam(name = "num1") int num1, @WebParam(name = "num2") int num2);  
}  

这两段代码生成相同的消息:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">  
    <S:Body>  
        <ns2:addNums xmlns:ns2="http://SoapStyles/">  
            <num1>1</num1>  
            <num2>2</num2>  
        </ns2:addNums>  
    </S:Body>  
</S:Envelope>  

正如 R Srini 在同一讨论中所说的那样,包装的是参数,而不是代码。

生成客户端的唯一区别是您要在客户端中创建params的方式,但它们都将根据服务WSDL生成相同的消息(包装或解包)。

使用BARE,您将只有一个带有“子参数”的顶部元素(参数)。这一个BARE将直接发送(不“包装”它)。使用WRAPPED时,您将在第一级中拥有所有这些“子参数”,并且客户端会自动将它们包装在另一个顶级元素中。

引用杰森欧文:

  

只传递了一个参数(“addNums”),并且它是“Bare”   身体。在第二个中,参数在代码中是“裸露的”,但是   由JAX-WS在运行时“包装”。

希望这有帮助!

答案 1 :(得分:1)

我对Wrapped和Bare风格的Web服务做了一些测试,这就是我发现的。

在本书中给出的示例中,SOAP消息在两种情况下都如下。

<soapenv:Body>
  <ns1:ItemSearch>
    <ns1:AWSAccessKeyId>...</ns1:AWSAccessKeyId>
    <ns1:Request>
      <ns1:Keywords>quantum gravity</ns1:Keywords>
      <ns1:SearchIndex>Books</ns1:SearchIndex>
    </ns1:Request>
  </ns1:ItemSearch>
</soapenv:Body>

在Wrapped样式中,SOAP:BODY之后的XML元素是操作名称

在BARE样式中,SOAP:BODY之后的XML元素是操作名称,而是请求参数名称。 (恰好与操作名称相同。)

答案 2 :(得分:0)

我认为这意味着虽然在Wrapped或Bare样式中处理参数的方式不同,但请求和响应的实际内容并没有不同。因此,无论服务器是处理Wrapped样式还是Bare样式的XML,从客户端传递到服务器的XML都是相同的。