suds在消费SOAP服务时抛出'找不到类型'错误

2 投票
2 回答
3001 浏览
提问于 2025-04-17 00:17

我正在使用 suds (0.4) 来调用一个 SOAP 网络服务。可是我用的这个 WSDL 文件却报错了。

>>> import uuid
>>> from suds.client import Client
>>> wsdl = 'https://toolkit.dnb.com/locked/resource/docs/TransactionAndMessageDefinition/ProductList.wsdl'
>>> client = Client(wsdl) 

这个服务需要一个参数 productListRequest,这个参数是一个复杂类型,里面需要放 UserIdPassword 和一个复杂类型的 ProductListInput

我把这些参数填成了:

>>> productListRequest = client.factory.create('productListRequest')
>>> productListRequest.UserId = 'myusername'
>>> productListRequest.Password = 'mypassword'
>>> productListRequest.TRNUID = uuid.uuid4()
>>> ProductListInput = client.factory.create('ProductListInput')
>>> ProductListInput.DnB_DUNS_Number = ''
>>> ProductListInput.Product = 'Product Name'
>>> ProductListInput.CountryCode = 'IT'
>>> ProductListInput.TradeUp = ''
>>> ProductListInput.Reason = ''
>>> productListRequest.ProductListInput = ProductListInput

但是每次我调用这个服务的时候:

>>> print client.service.ws_ProductList(productListRequest)

我都会收到一个错误提示:Type not found: 'ArrayOfUPD_FLDSItem'

我真的卡住了。我已经在网上查了这个错误两天,老实说我不知道该怎么办!也许有对 WSDL 和 suds 更了解的人能帮我。

所以我有几个问题:

  • 我用的这个 WSDL 定义得正确吗?(如果它是正确的,我会向 suds 的维护者反馈)

  • 如果这个 WSDL 定义不正确,有没有什么解决办法(比如说 suds 的 schema doctor)可以在 suds 网站上修复它?

  • 有没有其他的 Python 库我应该使用?

2 个回答

0

首先: 在没有DUNS号码的情况下调用产品列表是没有意义的。这个交易是根据给定的DUNS号码来提供所有可用的产品。如果DUNS号码留空,你只会得到你所指定的产品的字段列表(前提是你在调用中输入了一个有效的产品名称,而不是“产品名称”)。

但是: 即使我把所有参数都填上,我还是遇到了同样的问题,无法解决。

建议联系DnB,让他们修正WSDL - 他们的WSDL存在很多问题:注意,他们在WSDL的实现中简单地遗漏了一个完整的交易(prodOrderRequest_3,用于从工具包档案中检索数据)。

我的解决办法是使用工具包的XML版本来处理这个和其他提到的交易。不幸的是。

1

Suds是目前在Python中处理WSDL的最佳选择。不过,WSDL本身非常复杂,所以想要从中得到好的结果并不容易。

幸运的是,Suds提供了丰富的日志记录功能,你可以利用这些功能来调试问题,这是解决问题的第一步。之前有个问题讲解了如何启用这个功能:

如何输出Suds生成或接收的内容?

不过,要完整回答类型错误的问题,需要查看详细的日志输出和/或源代码,所以我建议你尽量缩小问题的范围。如果能提供一个(不工作的)示例架构和Python代码,那就更好了。

(这个错误可能暗示有某个子架构或外部架构被定义了但缺失,导致Suds无法加载,原因可能是X)

撰写回答