我正在使用suds (0.4)的SOAP Web服务。我使用的WSDL会抛出错误
>>> import uuid
>>> from suds.client import Client
>>> wsdl = 'https://toolkit.dnb.com/locked/resource/docs/TransactionAndMessageDefinition/ProductList.wsdl'
>>> client = Client(wsdl)
我正在使用的服务需要一个参数productListRequest
,这是一个复杂类型,您可以放置UserId
,Password
和复杂类型的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'
我真的被困在这里了。我用Google搜索了这个错误2天,说实话,我不知道该怎么办!也许对WSDL和suds有更深入理解的人可以提供帮助。
所以我的问题:
这个WSDL是我正在消费的吗? (如果定义合适,我会向肥皂水报告 维护者)
如果没有正确定义此WSDL,是否有解决方法(例如 suds schema doctor)将其固定在肥皂水网站上?
是否有其他Python库,我应该使用它?
答案 0 :(得分:1)
Suds目前是Python中WSDL消费的最佳选择。不幸的是,WSDL本身就是一个如此复杂的混乱,很难从中获利。
幸运的是,Suds具有广泛的日志记录功能,您可以使用它来调试问题,这是解决问题的第一步。之前的问题回答了如何启用它:
How can I output what SUDs is generating/receiving?
但是,给出类型错误的完整答案需要查看大量的日志记录输出和/或源代码,因此我建议您以某种方式尝试缩小问题范围。为了使问题最终可以解决,样本(非工作)模式和Python代码会很好。
(该错误可能暗示存在某些子模式/外部模式已定义/缺失,因为X而无法加载Suds)
答案 1 :(得分:0)
起初: 没有DUNS-Number就调用产品列表没有意义。该交易将所有可用产品提供给给定的DUNS。如果DUNS号码留空,您将只获得您所述产品的字段列表(假设您在呼叫中输入了有效的产品名称,而不是“产品名称”)。
<强> BUT:强> 即使把所有参数都放进去,我也遇到了同样的问题而且无法解决它。
检查DnB并使它们更正WSDL - 它们的WSDL非常错误:注意它们只是忘记了WSDL实现中的整个事务(prodOrderRequest_3用于从工具包存档中检索数据)
我的解决方案是使用Toolkit的XML版本和其他提到的事务。不幸的是