2014-02-14 26 views
3

我正在使用suds向第三方API發出SOAP請求。如何指定factory.create的完整名稱空間()

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' 

所以我打印list of available suds factory typesprint(client)

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()的文檔,但它只接受一個參數名稱,沒有關於名稱空間URL或任何其他參數的其他參數。

有沒有辦法動態確定TheObject的命名空間?或者是否可以指定整個URL爲ns0而不僅僅是命名空間別名?任何幫助,將不勝感激。

回答

5

而且它對我來說應該是很明顯的,它是一個標準的XML命名空間,並且它在documentation(我錯過了)中清楚地表明瞭它。

要指定由URL命名空間,你只需通過命名空間URL包裹在{}(逗號)作爲名稱的前綴:

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