【问题标题】:Soap Server raised fault: 'java.lang.NullPointerException'. How to debug?Soap 服务器引发错误:“java.lang.NullPointerException”。如何调试?
【发布时间】:2015-05-17 19:45:39
【问题描述】:

我正在尝试从荷兰土地登记处 (WSDL here) 调用 SOAP 网络服务。我第一次尝试使用pysimplesoap library 这样做。虽然我确实得到了相关的 xml,但 pysimplesoap 给出了一个TypeError: Tag: IMKAD_Perceel invalid (type not found)(我创建了一个SO question about that here)。由于我怀疑这是 pysimplesoap 中的错误,我现在尝试使用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:

<soap:Body>
  <VerzoekTotInformatieRequest xmlns="http://www.kadaster.nl/schemas/kik-inzage/20141101">
    <Aanvraag xmlns="http://www.kadaster.nl/schemas/kik-inzage/ip-aanvraag/v20141101">
      <berichtversie xmlns="http://www.kadaster.nl/schemas/kik-inzage/ip-aanvraag/v20141101">4.7</berichtversie>
      <klantReferentie xmlns="http://www.kadaster.nl/schemas/kik-inzage/ip-aanvraag/v20141101">ARNHEM-AC-1234</klantReferentie>
      <productAanduiding xmlns="http://www.kadaster.nl/schemas/kik-inzage/ip-aanvraag/v20141101">1185</productAanduiding>
      <Ingang xmlns="http://www.kadaster.nl/schemas/kik-inzage/ip-aanvraag/v20141101">
        <Object xmlns="http://www.kadaster.nl/schemas/kik-inzage/ip-aanvraag/v20141101">
          <IMKAD_KadastraleAanduiding xmlns="http://www.kadaster.nl/schemas/kik-inzage/ip-aanvraag/v20141101">
            <gemeente xmlns="http://www.kadaster.nl/schemas/kik-inzage/ip-aanvraag/v20141101">ARNHEM AC</gemeente>
            <sectie xmlns="http://www.kadaster.nl/schemas/kik-inzage/ip-aanvraag/v20141101">AC</sectie>
            <perceelnummer xmlns="http://www.kadaster.nl/schemas/kik-inzage/ip-aanvraag/v20141101">5569</perceelnummer>
          </IMKAD_KadastraleAanduiding>
        </Object>
      </Ingang>
    </Aanvraag>
  </VerzoekTotInformatieRequest>
</soap:Body>

所以现在我尝试更改此代码以改用 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>

不幸的是,这会导致服务器返回一个 Nullpointer:

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'

这个错误当然是非常无用的。该错误没有提示导致 NullPointer 的原因。

如果我查看 pysimplesoap 和 suds 通过网络发送的 xml 之间的差异,suds 的 xml 缺少很多 xmlns 定义(尽管我不知道它们是否需要)和名称标签包括前缀,例如ns0:。我不知道这些差异是否相关,我也不知道如何让 suds 创建与 pysimplesoap 相同的 xml。

虽然wsdl file of the service 是公开的,但服务本身是付费的(每年 60 欧元 + 每个成功请求 3 欧元)。所以我猜想阅读这篇文章的人很难/不可能重现这个问题,而且我不能在这里真正给出我的用户凭据。

但由于我真的被这个问题困住了,也许有人可以给我一些关于如何调试的提示?例如;如何让 suds 创建与 pysimplesoap 相同的 xml?或者我如何获得有关空指针的更多信息?

欢迎任何帮助!

【问题讨论】:

    标签: python web-services soap wsdl suds


    【解决方案1】:

    这与其说是一个答案,不如说是一个来自 Python 和 SOAP 先前经验的建议。

    1. 找到一些好的(已建立,SOAP 参考)Java 工具,用于在给定 WSDL 的情况下进行 SOAP 查询。
    2. 进行一些您感兴趣的典型查询,并将发送/接收的内容记录为模板
    3. 忘记 Python SOAP 库,只使用模板来查询 SOAP 端点(Python 有很多模板语言)。

    如果步骤 2. 使用著名的 Java 工具失败,请联系您所支付服务的技术支持。

    您是否检查过所有这些漂亮的 XSD 是否真的由 Python SOAP 客户端下载?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-06
      • 1970-01-01
      相关资源
      最近更新 更多