Я использую suds для выполнения запросов SOAP к стороннему API.
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)
:
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
? Или можно указать полный URL-адрес для ns0
вместо только псевдонима пространства имен? Любая помощь будет оценена по достоинству.