我是webservice的新手,并阅读了“Java WebServices Up and Running”一书。不知何故,我觉得这对初学者来说有点混乱。在第54页,它是相互矛盾的陈述。
首先它说
在展开的样式中,参数出现裸露;就是说,作为一个 SOAP主体中未展开的XML子元素序列。在包裹的风格, 参数作为带有名称的XML元素的包装XML子元素发生 服务操作
然后它说。
可能令人惊讶的是底层SOAP消息的结构 请求和响应保持不变。例如,请求消息 从简化的客户端,AmazonClientU在结构上与请求消息相同 来自复杂的客户端AmazonClientW。
我尝试编写示例程序,我清楚地看到Wrapped Style和Bare风格的SOAP消息之间的区别。 Bare样式不包含SOAP正文中的操作名称。
有人请澄清。提前谢谢..
答案 0 :(得分:2)
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都是相同的。