我正在使用suds向第三方API发出SOAP请求。
import suds.client
client = suds.client.Client(WSDL_URL, location=SERVICE_URL)
当我尝试为WSDL定义的特定类型创建对象时(比如TheObject
):
obj = client.factory.create('TheObject')
我收到一条关于它不存在的错误:
(TheObject) not-found
path: "TheObject", not-found
Traceback (most recent call last):
File "suds_test.py", line 67, in <module>
sys.exit(main(sys.argv))
File "suds_test.py", line 51, in main
obj = client.factory.create('TheObject'),
File "/usr/local/lib/python2.7/dist-packages/suds/client.py", line 234, in create
raise TypeNotFound(name)
suds.TypeNotFound: Type not found: 'TheObject'
所以我用print(client)
打印list of available suds factory types:
Suds ( https://fedorahosted.org/suds/ ) version: 0.4 GA build: R699-20100913
Service ( OrderService ) tns="http://api.example.com/services/"
Prefixes (2)
ns0 = "http://api.example.com/contracts/stuff"
ns1 = "http://api.example.com/services/"
Ports (2):
(OrderServiceSoap)
Methods (123):
... Not really relevant
Types (123):
SomeType
SomeType2
ns0:AnotherType
ns0:AnotherType2
ns0:TheObject
...
因此ns1
似乎是默认命名空间,ns0
是我想用于TheObject
的命名空间。如果我用命名空间别名作为前缀,它就可以工作。
obj = client.factory.create('ns0:TheObject')
我宁愿不记得在这种特殊情况下使用ns0
,因为它随意变化。我查找了Factory.create()
的文档,但它只接受一个参数 name ,没有名称空间URL或任何其他参数。
有没有办法动态确定TheObject
的命名空间?或者是否可以指定ns0
的整个URL而不仅仅是命名空间别名?任何帮助将不胜感激。
答案 0 :(得分:5)
对我而言,它应该是一个标准的XML命名空间,并且在documentation(我错过了)中清楚地表明了它。
要通过URL指定命名空间,只需在名称前加上{}
(花括号)中包含的命名空间URL:
obj = client.factory.create('{http://api.example.com/contracts/stuff}TheObject')