使用肥皂水时类型和信封的命名空间:添加XSI(Adding xsi:type and envelop

2019-06-25 06:24发布

我需要与SOAP服务交互时遇到了很多麻烦这样做; 真的很感激有这方面的指针。 原始的错误消息是:

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

经过一番研究,事实证明,这是肥皂水之间的意见分歧,服务器必须如何与应对

type="xsd:anyType"

有问题的元件。

我已经使用SOAPUI并确认该问题可以通过采取这些步骤是固定的意见后:

  1. 添加的xsi:type =“XSD:字符串”到其每一个会导致问题元件
  2. 添加的xmlns:XSD = “http://www.w3.org/2001/XMLSchema” 中的SOAP信封

所以,在目前使用仪器做到这一点:

<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的建议,但还没有真正grokked如何达到预期的效果。

Answer 1:

我找到的解决方案是使用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'))


Answer 2:

这是可悲的,热闹,就像一个关于这个特定库的东西很多,但这里的确切的答案:

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

基本上,它在实现中的错误,您可以通过编辑运行插件实际上会返回插件的结果行自己修补它,但我不知道一杯啤酒的修补和更新版本修复了这个尚未(寿我还没有为它仔细地看了看)。



文章来源: Adding xsi:type and envelope namespace when using SUDS