将soap enevlope中的名称空间移动到python中的有效负载级别

时间:2016-05-26 16:33:32

标签: python soap suds

我正在使用suds-jurko(0.6)和python 2.7

生成当前的肥皂请求



<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:ns0="http://xxxxx/A" xmlns:ns1="http://xxxxxx/B" xmlns:ns2="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope">
   <SOAP-ENV:Header/>
   <ns2:Body>
      <ns1:Request>             
         <Parameter xsi:type="ns1:GetParameter">
            <Identifier xsi:type="ns0:NumberIdentifier">
               <Number>2</Number>
            </Identifier>
         </Parameter>
      </ns1:Request>
   </ns2:Body>
</SOAP-ENV:Envelope>
&#13;
&#13;
&#13;

所需的肥皂请求应为

&#13;
&#13;
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:ns1="http://xxxxxx/B" xmlns:ns2="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope">
   <SOAP-ENV:Header/>
   <ns2:Body>
      <ns1:Request xmlns:ns0="http://xxxxx/A">            
         <Parameter xsi:type="ns1:GetParameter">
            <Identifier xsi:type="ns0:NumberIdentifier">
               <Number>2</Number>
            </Identifier>
         </Parameter>
      </ns1:Request>
   </ns2:Body>
</SOAP-ENV:Envelope>
&#13;
&#13;
&#13;

问题

我正在使用wsdl拨打电话。有没有办法在suds中使用set-options或其他方法,我可以通过它强制客户端在节点处创建soap信封namepsaces而不是soap:enevlope节点上的所有内容

1 个答案:

答案 0 :(得分:0)

我找到了解决方案来移动namspaces。不确定它是否是最佳方式,但它的工作原理。

 def marshalled(self, context):
        context.envelope.normalizePrefixes()           
        remove = {'1': '1'}

        for prefix, ns in context.envelope.nsprefixes.iteritems():
            if ns != 'http://www.w3.org/2003/05/soap-envelope': 
                remove[prefix] = str(ns)                
            
        for prefix, ns in remove.iteritems():
            if prefix != '1':
                context.envelope.clearPrefix(prefix)
        

        body = context.envelope.getChild('Body')
        request = body[0]      
        request.addPrefix('xsi','http://www.w3.org/2001/XMLSchema-instance')   

        for prefix, ns in remove.iteritems():
            if prefix != '1':
                request.addPrefix(prefix,ns)