SOAP suds и ужасная схема Тип Не найдена ошибка
Я использую последнюю версию suds (https://fedorahosted.org/suds/) в первый раз, и я застопорился на первом шаге,
suds.TypeNotFound: Type not found: '(schema, http://www.w3.org/2001/XMLSchema, )'
Теперь я знаю, что это хорошо освещенная земля в мире пены (https://fedorahosted.org/suds/wiki/TipsAndTricks#Schema-TypeNotFound и Python/Suds: Тип не найден: 'xs: complexType'), но это выглядит несколько иначе, потому что (а) схема должна автоматически привязываться после версии 0.3.4 и (б) даже явно использовать обходной путь, он все равно не работает.
from suds.client import Client
from suds.xsd.sxbasic import Import
url = 'file:wsdl.wsdl'
Import.bind('http://schemas.xmlsoap.org/soap/encoding/')
client = Client(url, cache = None)
с wsdl:
<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
xmlns:tns="http://ws.client.com/Members.asmx"
xmlns:s="http://www.w3.org/2001/XMLSchema"
xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
targetNamespace="http://ws.client.com/Members.asmx"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:types>
<s:schema elementFormDefault="qualified" targetNamespace="http://ws.client.com/Members.asmx">
<s:element name="GetCategoriesResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="GetCategoriesResult">
<s:complexType>
<s:sequence>
<s:element ref="s:schema" />
<s:any />
</s:sequence>
</s:complexType>
</s:element>
</s:sequence>
</s:complexType>
</s:element>
</s:schema>
</wsdl:types>
</wsdl:definitions>
дает исключение выше.
Ответы
Ответ 1
Мы получили его работу, и я надеюсь, что и вы это сделали, хотя это немного причудливо. Возможно, поможет явное местоположение или фильтр. Например:.
imp = Import('http://schemas.xmlsoap.org/soap/encoding/', location='http://schemas.xmlsoap.org/soap/encoding/')
imp.filter.add('http://ws.client.com/Members.asmx')
client = Client(url,plugins=[ImportDoctor(imp)]
Ответ 2
Я некоторое время стучал головой об этом. Я, наконец, решил проблему, используя следующий синтаксис:
from suds.xsd.doctor import ImportDoctor, Import
url = 'http://somedomain.com/filename.php?wsdl'
imp = Import('http://schemas.xmlsoap.org/soap/encoding/')
imp.filter.add('http://some/namespace/A')
doctor = ImportDoctor(imp)
client = Client(url, doctor=doctor)
Важно, начните с URL. Откройте этот файл в своем браузере, и он предоставит вам определения wsdl. Убедитесь, что у вас есть правильный url, введенный здесь, и что фактически открывается XML файл. Также обратите внимание на? Wsdl в конце URL-адреса.
Во-вторых, imp = Import('http://schemas.xmlsoap.org/soap/encoding/')
импортирует стандартную схему SOAP.
В-третьих, imp.filter.add('http:somedomain.com/A')
добавит ваше конкретное пространство имен. Вы можете найти это пространство имен, открыв URL-адрес, указанный выше в url=
, и найдите раздел <wsdl:import namespace="http://somedomain.com/A"
.
Также обратите внимание на http vs https в своих URL-адресах.
Ответ 3
Для тех, кто все еще обеспокоен этой проблемой. Эта ссылка https://bitbucket.org/jurko/suds/issue/20/typenotfound-schema может предоставить полезную информацию. Решение будет таким:
from suds.client import Client
from suds.xsd.doctor import Import, ImportDoctor
url = 'http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl'
imp = Import('http://www.w3.org/2001/XMLSchema',
location='http://www.w3.org/2001/XMLSchema.xsd')
imp.filter.add('http://WebXml.com.cn/')
client = Client(url, doctor=ImportDoctor(imp))