3

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

首先它说

在展开样式中,参数是裸露的;也就是说,作为 SOAP 主体中未包装的 XML 子元素的序列。在包装样式中,参数作为具有服务操作名称的 XML 元素的包装 XML 子元素出现

然后它说。

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

我尝试编写一个示例程序,我清楚地看到了 Wrapped Style 和 Bare 样式的 SOAP 消息之间的区别。Bare 样式在 SOAP 主体中不包含操作名称。

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

4

3 回答 3

3

Java Ranch 论坛上的这个讨论为我清除了它。特别是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在同一讨论中所说,包装的是参数,而不是代码。

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

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

引用杰森欧文的话:

只传递了一个参数(“addNums”),它在正文中是“Bare”。在第二种情况下,参数在代码中是“裸露的”,但在运行时由 JAX-WS “包装”。

希望这可以帮助!

于 2013-08-14T20:15:08.753 回答
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 元素不是操作名称,而是请求参数名称。(恰好与操作名称相同。)

于 2013-01-01T08:06:07.777 回答
0

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

于 2013-01-01T07:51:43.683 回答