6.2. 在 SOAP 1.1 Binding 中添加 SOAP 标头
概述
SOAP 标头通过将 soap:header
元素添加到默认的 SOAP 1.1 绑定中定义。soap:header
元素是绑定的 输入
、输出和
fault
元素的可选子级。SOAP 标头成为父消息的一部分。SOAP 标头通过指定消息和消息部分来定义。每个 SOAP 标头只能包含一个消息部分,但您可以根据需要插入任意数量的 SOAP 标头。
语法
例 6.3 “SOAP 标头语法” 中显示定义 SOAP 标头的语法。soap:header
的 message
属性是生成了部分插入到标头中的消息的合格名称。part
属性是插入到 SOAP 标头中的消息部分的名称。由于 SOAP 标头始终是文档样式的,因此必须使用元素定义插入到 SOAP 标头中的 WSDL 消息部分。message
和 part
属性一起完全描述要插入到 SOAP 标头中的数据。
例 6.3. SOAP 标头语法
<binding name="headwig"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <operation name="weave"> <soap:operation soapAction="" style="document"/> <input name="grain"> <soap:body ... /> <soap:header message="QName" part="partName"/> </input> ... </binding>
以及强制 消息和
部分
属性,soap:header
也支持 命名空间
、use
,以及 encodingStyle
属性。这些属性的功能与 soap:body
的 soap:header
相同。
在正文和标头之间分割消息
插入到 SOAP 标头中的消息部分可以是合同中的任何有效消息部分。它甚至也可以是来自用作 SOAP 正文的父消息的一部分。由于不太可能在同一消息中发送信息两次,因此 SOAP 绑定提供了一种指定插入到 SOAP 正文中的消息部分的方法。
soap:body
元素有一个可选属性 parts
,它采用以空格分隔的部分名称列表。当定义 部分
时,只有列出的消息部分会插入到 SOAP 正文中。然后,您可以将剩余的部分插入到 SOAP 标头中。
当您使用父消息的部分定义 SOAP 标头时,Apache CXF 会自动填写 SOAP 标头。
示例
例 6.4 “使用 SOAP 标头的 SOAP 1.1 Binding” 显示 例 6.1 “排序系统接口” 中显示的 orderWidgets
服务的修改版本。此版本已被修改,每个顺序都有一个 xsd:base64binary
值,放置在请求和响应的 SOAP 标头中。SOAP 标头定义为 widgetKey
消息中的 keyVal
部分。在这种情况下,您负责将 SOAP 标头添加到应用程序逻辑中,因为它不是输入或输出消息的一部分。
例 6.4. 使用 SOAP 标头的 SOAP 1.1 Binding
<?xml version="1.0" encoding="UTF-8"?> <definitions name="widgetOrderForm.wsdl" targetNamespace="http://widgetVendor.com/widgetOrderForm" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://widgetVendor.com/widgetOrderForm" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsd1="http://widgetVendor.com/types/widgetTypes" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"> <types> <schema targetNamespace="http://widgetVendor.com/types/widgetTypes" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> <element name="keyElem" type="xsd:base64Binary"/> </schema> </types> <message name="widgetOrder"> <part name="numOrdered" type="xsd:int"/> </message> <message name="widgetOrderBill"> <part name="price" type="xsd:float"/> </message> <message name="badSize"> <part name="numInventory" type="xsd:int"/> </message> <message name="widgetKey"> <part name="keyVal" element="xsd1:keyElem"/> </message> <portType name="orderWidgets"> <operation name="placeWidgetOrder"> <input message="tns:widgetOrder" name="order"/> <output message="tns:widgetOrderBill" name="bill"/> <fault message="tns:badSize" name="sizeFault"/> </operation> </portType> <binding name="orderWidgetsBinding" type="tns:orderWidgets"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <operation name="placeWidgetOrder"> <soap:operation soapAction="" style="document"/> <input name="order"> <soap:body use="literal"/> <soap:header message="tns:widgetKey" part="keyVal"/> </input> <output name="bill"> <soap:body use="literal"/> <soap:header message="tns:widgetKey" part="keyVal"/> </output> <fault name="sizeFault"> <soap:body use="literal"/> </fault> </operation> </binding> ... </definitions>
您还可以修改 例 6.4 “使用 SOAP 标头的 SOAP 1.1 Binding”,以便标头值是输入和输出信息的一部分。