gpt4 book ai didi

java - 如何接受 SOAP header 部分的 MustUnderstand 和其他属性?

转载 作者:太空宇宙 更新时间:2023-11-04 08:07:49 25 4
gpt4 key购买 nike

我有一个基于 SOAP 的 Web 服务的 WSDL,其中包含自定义 header :

<message name="Request">
<part element="common:Request" name="Request"></part>
<part element="common:myHeader" name="Header"></part>
</message>

<operation name="processRequest">
<soap:operation soapAction=""/>
<input>
<soap:body parts="Request" use="literal"/>
<soap:header message="tns:Request" part="Header" use="literal"></soap:header>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>

header 类型在单独的架构文件中定义:

<xs:element name="myHeader" nillable="false" type="tns:myHeaderType"/>

<xs:complexType name="myHeaderType">
<xs:sequence minOccurs="1" maxOccurs="1">
<xs:element name="JobID" type="tns:JobIDType" minOccurs="1" maxOccurs="1"/>
<xs:element name="TransactionID" type="xs:string" minOccurs="1" maxOccurs="1"/>
</xs:sequence>
</xs:complexType>

此外,我还根据 myHeaderType 的定义进行验证,以确保存在所需的元素、满足格式限制等。这一切似乎都正常工作,因为格式正确的请求会被接受,格式不正确的请求会被拒绝。

我的问题出现在使用 Apache Axis(隐藏在专有工具后面)生成 Web 服务客户端的消费者身上。正如另一个 StackOverflow 问题 here 中所述,Axis 在 myHeader 上插入 SOAP 标准允许的一些可选属性 ( as nearly as I can tell ):

<soapenv:Header>
<com:myHeader soapenv:mustUnderstand="0" soapenv:actor="">
^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^
<JobID>myJobId</JobID>
<TransactionID>myTransactionId</TransactionID>
</com:myHeader>
</soapenv:Header>

由于我的消费者正在使用的工具,修改 Axis 生成的 stub 以省略这些属性是不可行的,正如其他地方所建议的那样。此外,如果我要声称自己是一个 SOAP 服务,那么我的服务似乎应该允许这些属性。我的问题是,如何修改 header 定义以适应这些可选属性,并理想地规划我可能没有预料到的属性。是否有一个可以为我的 header 类型定义扩展的标准类型,或者这种情况的一般最佳实践?

最佳答案

今天我找到了解决问题的几个方法。它们都解决了问题,但我对两者中哪一个更好的判断没有信心,所以我将在这里介绍它们。

两种解决方案都以修改 myHeaderType 的定义为中心以便它能够容纳未预料到的 SOAP 定义的属性。

  1. 在 SOAP WSDL 架构定义 ( http://schemas.xmlsoap.org/wsdl/ ) 中,有一个名为 tExtensibleAttributesDocumented 的类型。其中包括以下非常灵活的属性定义:

    <xs:anyAttribute namespace="##other" processContents="lax"/>

    通过扩展这个抽象类型,我能够将这种对意外属性的自由允许纳入到我的类型中。这是生成的代码:

      <xs:complexType name="myHeaderType">
    <xs:complexContent>
    <xs:extension base="wsdl:tExtensibleAttributesDocumented">
    <xs:sequence minOccurs="1" maxOccurs="1">
    <xs:element name="JobID" type="tns:JobIDType" minOccurs="1" maxOccurs="1"/>
    <xs:element name="TransactionID" type="xs:string" minOccurs="1" maxOccurs="1"/>
    </xs:sequence>
    </xs:extension>
    </xs:complexContent>
    </xs:complexType>

    请注意,这不会检查 mustUnderstand 的内容或actor ,并允许其他属性,包括完全垃圾,只要它来 self 在 XML 请求中定义的命名空间。

  2. 另一种选择是直接包含 <xs:anyAttribute>在我的类型中:

      <xs:complexType name="myHeaderType">
    <xs:sequence minOccurs="1" maxOccurs="1">
    <xs:element name="JobID" type="tns:JobIDType" minOccurs="1" maxOccurs="1"/>
    <xs:element name="TransactionID" type="xs:string" minOccurs="1" maxOccurs="1"/>
    </xs:sequence>
    <xs:anyAttribute namespace="##other" processContents="lax"/>
    </xs:complexType>

    据我所知,这基本上具有相同的效果。

如果这些解决方案之间存在任何我不知道的细微差别,我很想知道。如果这种情况有一个公认的标准,我找不到它。该解决方案的另一个弱点是我无法获取属性来根据其在架构中的定义进行验证。更改 processContents属性为strict甚至阻止了明确定义的 mustUnderstandactor属性被处理。

关于java - 如何接受 SOAP header 部分的 MustUnderstand 和其他属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11785144/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com