1

我需要与 SOAP 服务进行交互,并且在这样做时遇到了很多麻烦;非常感谢对此的任何指示。原来的错误信息是:

org.apache.axis2.databinding.ADBException: Any type element type has not been given

经过一番研究,事实证明这是SUDS之间的分歧,服务器必须如何处理

type="xsd:anyType"

关于有问题的元素。

我已经确认使用 SOAPUI,并且在建议可以通过以下步骤解决问题后:

  1. 将 xsi:type="xsd:string" 添加到导致问题的每个元素
  2. 将 xmlns:xsd="http://www.w3.org/2001/XMLSchema" 添加到 SOAP 信封

因此,SUDS 目前在哪里执行此操作:

<SOAP-ENV:Envelope ... xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<ns3:Body>
  <ns0:method>
     <parameter>
        <values>
           <table>
              <key>EMAIL_ADDRESS</key>
              <value>example@example.org</value>
           </table>
        </values>
     </parameter>
  </ns0:method>

它应该产生这个:

<SOAP-ENV:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" ... xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">

  <ns3:Body>
  <ns0:method>
     ...
     <parameter>
        <values>
           <table>
              <key xsi:type="xsd:string">EMAIL_ADDRESS</key>
              <value xsi:type="xsd:string">example@example.org</value>
           </table>
        </values>
     </parameter>
  </ns0:method>

有没有正确的方法来做到这一点?我已经看到使用 ImportDoctor 或 MessagePlugins 的建议,但还没有真正了解如何达到预期的效果。

4

2 回答 2

10

我找到的解决方案是使用 MessagePlugin 在发送之前手动修复 XML。我希望有更优雅的东西,但至少这是可行的:

class SoapFixer(MessagePlugin):

    def marshalled(self, context):
        # Alter the envelope so that the xsd namespace is allowed
        context.envelope.nsprefixes['xsd'] = 'http://www.w3.org/2001/XMLSchema'
        # Go through every node in the document and apply the fix function to patch up incompatible XML. 
        context.envelope.walk(self.fix_any_type_string)

    def fix_any_type_string(self, element):
        """Used as a filter function with walk in order to fix errors.
        If the element has a certain name, give it a xsi:type=xsd:string. Note that the nsprefix xsd must also
         be added in to make this work."""
        # Fix elements which have these names
        fix_names = ['elementnametofix', 'anotherelementname']
        if element.name in fix_names:
            element.attributes.append(Attribute('xsi:type', 'xsd:string'))
于 2012-06-11T09:46:08.900 回答
1

就像这个特定图书馆的很多事情一样,这既可悲又可笑,但这是确切的答案:

http://lists.fedoraproject.org/pipermail/suds/2011-September/001519.html

从上面:

soapenv = soapenv.encode('utf-8')
plugins.message.sending(envelope=soapenv)

变成:

soapenv = soapenv.encode('utf-8')
ctx = plugins.message.sending(envelope=soapenv)
soapenv = ctx.envelope

基本上,这是实现中的一个错误,您可以通过编辑运行插件的行来自己修补它以实际返回插件的结果,但我不知道修复此问题的 SUDS 的修补和更新版本(虽然我没有仔细看)。

于 2012-09-12T15:06:51.293 回答