如何为factory.create()指定完整的命名空间

时间:2014-02-14 16:24:57

标签: python soap wsdl suds

我正在使用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而不仅仅是命名空间别名?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:5)

对我而言,它应该是一个标准的XML命名空间,并且在documentation(我错过了)中清楚地表明了它。

要通过URL指定命名空间,只需在名称前加上{}(花括号)中包含的命名空间URL:

obj = client.factory.create('{http://api.example.com/contracts/stuff}TheObject')