ошибка проверки схемы со spyne и soappy

Я использую Spyne для создания простого веб-сервиса, и когда я вызываю этот пример сервиса, я получаю следующую ошибку:

faultType: <Fault senv:Client.SchemaValidationError: :10:0:ERROR:SCHEMASV:SCHEMAV_CVC_ELT_1: Element 'testMethod': No matching global declaration available for the validation root.>


************************************************************************
*** Outgoing SOAP ******************************************************
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/1999/XMLSchema"
>
<SOAP-ENV:Body>
<testMethod SOAP-ENC:root="1">
<name xsi:type="xsd:string">john</name>
</testMethod>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>



*** Incoming SOAP ******************************************************
<?xml version='1.0' encoding='UTF-8'?>
<senv:Envelope xmlns:senv="http://schemas.xmlsoap.org/soap/envelope  /"><senv:Body><senv:Fault>  <faultcode>senv:Client.SchemaValidationError</faultcode> <faultstring>:10:0:ERROR:SCHEMASV:SCHEMAV_CVC_ELT_1: Element 'testMethod': No matching global declaration available for the validation root.</faultstring><faultactor></faultactor></senv:Fault></senv:Body></senv:Envelope>

УСЛУГА

views.py

class ServiceWsTest(ServiceBase):
    __namespace__ = "appname"

    @rpc(Unicode, _returns=Unicode)
    def testMethod(self, name):
        return "Hello {}" .format(name)

ws_test = csrf_exempt(DjangoApplication(Application([ServiceWsTest],
     'appname',
     in_protocol=Soap11(validator='lxml'),
     out_protocol=Soap11(cleanup_namespaces=True),
     #interface=Wsdl11(),
)))

urls.py

 url(r'^sample/service', DjangoView.as_view(
            services=[ServiceWsTest], tns='appname',
            in_protocol=Soap11(validator='lxml'), 
            out_protocol=Soap11(cleanup_namespaces=True))),

Вызов службы с использованием soappy

from SOAPpy import WSDL, SOAPProxy
server = SOAPProxy('http://IP ADDRESS/sandbox/sample/service/')
server.testMethod('john')

Если я использую пену, все работает нормально.

client = suds.client.Client("http://IP ADDRESS/sandbox/sample/service.wsdl", cache=None)
client.service.testMethod('jane')

Hello jane

пожалуйста, порекомендуйте


person Asif    schedule 27.04.2015    source источник


Ответы (1)


В запросе Soappy есть две проблемы:

  1. Он не использует правильное пространство имен. Тег testMethod должен находиться в пространстве имен "appname". Поскольку в документе нет объявления пустого пространства имен (xmlns="appname"), фактическое пространство имен тега не определено.

  2. Он использует стиль кодирования rpc (есть xsi:type атрибутов), тогда как в WSDL, сгенерированном Spyne, явно говорится об использовании кодировки документа.

Не используйте мыло, просто используйте пену. Насколько мне известно, soappy не обслуживалась годами.

person Burak Arslan    schedule 28.04.2015