SOAP suds и страшная ошибка типа Not Found - PullRequest
16 голосов
/ 18 января 2011

Я впервые использую последнюю версию 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' ), но это выглядит немного иначе поскольку (a) схема должна автоматически связываться после версии 0.3.4, а (b) даже явно использовать обходной путь, она все равно не работает.

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>

дает исключение выше.

Ответы [ 3 ]

18 голосов
/ 22 мая 2013

Я немного ударился головой об этом. Я наконец решил проблему, используя следующий синтаксис:

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 против https в ваших URL.

11 голосов
/ 11 мая 2011

У нас получилось, и я надеюсь, что у вас тоже получилось, хотя это немного странно.Возможно, явное местоположение или фильтр помогут.Например:

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)])
6 голосов
/ 10 апреля 2015

Для тех, кто все еще обеспокоен этой проблемой. Эта ссылка 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))
...