<h3>更新(在PHP示例输出之后)</h3>
<p>不清楚<code>suds</code>为什么使用<code>{uri:external.query.name.availability.asic.gov.au}</code>
代替<code>businessDocumentHeader</code>元素的<code>{uri:business.document.header.types.asic.gov.au}</code>。在</p>
<p>解决这个问题的快捷而肮脏的方法是使用<code>suds.plugin</code>例如:</p>
<pre><code>from suds.plugin import MessagePlugin
class NsHeaderPlugin(MessagePlugin):
def sending(self, context):
context.envelope = context.envelope.replace('ns1:businessDocumentHeader',
'ns0:businessDocumentHeader')
</code></pre>
<p>或者</p>
^{pr2}$
<hr/>
<p>第二个参数应该是<code>ns3:requestDataType</code>,而不是您指定的<code>ns3:businessDocumentBody</code>。在</p>
<p>一般代码流程:</p>
<pre><code>from suds.client import Client # pip install suds
#XXX: change envelope namespace
from suds.bindings import binding
binding.envns = (binding.envns[0], 'http://www.w3.org/2003/05/soap-envelope')
del binding
# change content type
headers = {'Content-Type': 'application/soap+xml; charset="UTF-8"'}
client = Client(wsdl_url, headers=headers, plugins=[NsHeaderPlugin()])
header = client.factory.create('{uri:business.document.header.types.asic.gov.au}'
'businessDocumentHeaderType')
header.messageType = "queryNameAvailability"
header.messageReferenceNumber = 1
header.messageVersion = 2
header.senderId = 192
header.senderType = "REGA"
body = client.factory.create('{uri:external.query.name.availability.asic.gov.au}'
'requestDataType')
body.proposedName = 'TEST'
body.bnNameAvailabilityCheck = 'true'
# make the call
result = client.service.externalQueryNameAvailability(header, body)
print result # for debugging, to find out what attributes are available
</code></pre>
<p>我没有看到未定义的名称空间,因此在您的情况下,<code>ImportDoctor</code>似乎不是必需的。但是,例如,如果使用了<code>xs:string</code>类型,并且没有提到<code>'http://schemas.xmlsoap.org/soap/encoding/'</code>,那么可以修复wsdl模式:</p>
<pre><code>from suds.xsd.doctor import Import, ImportDoctor
imp = Import('http://schemas.xmlsoap.org/soap/encoding/')
# add namespaces where the type is used (call `imp.filter.add` multiple times)
imp.filter.add("http://asic.gov.au/wsdl/name/availability/external")
doctor = ImportDoctor(imp)
client = Client(wsdl_url, doctor=doctor)
</code></pre>