我正在尝试从荷兰土地注册处调用SOAP web服务(WSDL here)。我第一次尝试使用pysimplesoap library来实现这一点。虽然我确实得到了相关的xml,但是pysimplesoap给出了一个TypeError: Tag: IMKAD_Perceel invalid (type not found)
(我创建了一个SO question about that here)。因为我怀疑这是pysimplesoap中的一个bug,所以我现在尝试使用suds library。在
在pysimplesoap中,以下内容返回了正确的xml(但正如我所说的pysimplesoap给出了一个TypeError):
from pysimplesoap.client import SoapClient
client = SoapClient(wsdl='http://www1.kadaster.nl/1/schemas/kik-inzage/20141101/verzoekTotInformatie-2.1.wsdl', username=xxx, password=xxx, trace=True)
response = client.VerzoekTotInformatie(
Aanvraag={
'berichtversie': '4.7', # Refers to the schema version: http://www.kadaster.nl/web/show?id=150593&op=/1/schemas/homepage.html
'klantReferentie': 'MyReference1', # Refers to something we can set ourselves.
'productAanduiding': '1185', # a four-digit code referring to whether the response should be in "XML" (1185), "PDF" (1191) or "XML and PDF" (1057).
'Ingang': {
'Object': {
'IMKAD_KadastraleAanduiding': {
'gemeente': 'ARNHEM',
'sectie': 'AC',
'perceelnummer': '1234'
}
}
}
}
)
这产生了以下xml:
^{pr2}$所以现在我试着把这个代码改成使用suds。到目前为止,我想到了这个:
from suds.client import Client
client = Client(url='http://www1.kadaster.nl/1/schemas/kik-inzage/20141101/verzoekTotInformatie-2.1.wsdl', username='xxx', password='xxx')
Aanvraag = client.factory.create('ns3:Aanvraag')
Aanvraag.berichtversie = '4.7'
Aanvraag.klantReferentie = 'MyReference1'
Aanvraag.productAanduiding = '1185'
IMKAD_KadastraleAanduiding = client.factory.create('ns3:IMKAD_KadastraleAanduiding')
IMKAD_KadastraleAanduiding.gemeente = 'ARNHEM'
IMKAD_KadastraleAanduiding.sectie = 'AC'
IMKAD_KadastraleAanduiding.perceelnummer = '1234'
Object = client.factory.create('ns3:Object')
Object.IMKAD_KadastraleAanduiding = IMKAD_KadastraleAanduiding
Ingang = client.factory.create('ns3:Ingang')
Ingang.Object = Object
Aanvraag.Ingang = Ingang
result = client.service.VerzoekTotInformatie(Aanvraag)
生成以下xml:
<ns2:Body>
<ns0:VerzoekTotInformatieRequest>
<ns0:Aanvraag>
<ns1:berichtversie>4.7</ns1:berichtversie>
<ns1:klantReferentie>MyReference1</ns1:klantReferentie>
<ns1:productAanduiding>1185</ns1:productAanduiding>
<ns1:Ingang>
<ns1:Object>
<ns1:IMKAD_KadastraleAanduiding>
<ns1:gemeente>ARNHEM</ns1:gemeente>
<ns1:sectie>AC</ns1:sectie>
<ns1:perceelnummer>1234</ns1:perceelnummer>
</ns1:IMKAD_KadastraleAanduiding>
</ns1:Object>
</ns1:Ingang>
</ns0:Aanvraag>
</ns0:VerzoekTotInformatieRequest>
</ns2:Body>
不幸的是,这会导致服务器返回空指针:
Traceback (most recent call last):
File "<input>", line 1, in <module>
result = client.service.VerzoekTotInformatie(Aanvraag)
File "/Library/Python/2.7/site-packages/suds/client.py", line 542, in __call__
return client.invoke(args, kwargs)
File "/Library/Python/2.7/site-packages/suds/client.py", line 602, in invoke
result = self.send(soapenv)
File "/Library/Python/2.7/site-packages/suds/client.py", line 649, in send
result = self.failed(binding, e)
File "/Library/Python/2.7/site-packages/suds/client.py", line 702, in failed
r, p = binding.get_fault(reply)
File "/Library/Python/2.7/site-packages/suds/bindings/binding.py", line 265, in get_fault
raise WebFault(p, faultroot)
WebFault: Server raised fault: 'java.lang.NullPointerException'
这个错误当然是无济于事的。这个错误没有给出任何关于导致空指针的提示。在
如果我看一下pysimplesoap和suds通过网络发送的xml之间的区别,xmlbysuds缺少很多xmlns
定义(尽管我不知道是否需要它们),并且标记的名称包括前缀,例如ns0:
。我不知道这些差异是否相关,也不知道如何让sud创建与pysimplesoap相同的xml。在
尽管wsdl file of the service是公共的,但服务本身是付费的(每年60欧元+每个成功请求3欧元)。所以我想阅读本文的人很难/不可能重现这个问题,我也不能在这里给出我的用户凭证。在
但既然我真的被这个问题困住了,也许有人可以给我一些关于如何调试这个的提示?例如,如何让suds创建与pysimplesoap相同的xml?或者我怎样才能得到关于空指针的更多信息?在
欢迎任何帮助!在
这与其说是一个答案,不如说是来自于以前使用Python和SOAP的经验的建议。在
如果步骤2。如果使用突出的Java工具失败,请联系您付费服务的技术支持。在
你检查过那些漂亮的xsd是否都是由pythonsoap客户机下载的吗?在
相关问题 更多 >
编程相关推荐