Модифицировать WSDL в мыльном веб-сервисе с помощью spyne of Python

Я разрабатываю с Django и Python, и мне нужно опубликовать 1 сервис с SOAP с 2 операциями. Для этой задачи я выбрал библиотеку spyne:

http://spyne.io/#auxproc=Sync&s=aux

Потому что, по-видимому, это легко понять и начать развиваться. Я сделал первый пример и был в порядке, даже я разработал свой собственный метод с моей внутренней логикой. Теперь мне нужно разработать другие функции, самые особенные. Мой текущий код:

class SopoSoap(ComplexModel):
    __namespace__ = 'http://service/service.wsdl'
    _type_info = {
        "field1": Integer(min_occurs = 1),
        "field2": Integer(min_occurs = 1),
        "field3": Unicode(min_occurs = 1),
        "field4": Unicode(min_occurs = 1),
        "field5": Unicode(min_occurs = 0),
    }

class NewIncidenceService(ServiceBase):
    @rpc(SopoSoap, _returns=Integer)
    def NewIncidence(sop):
        # my differetns operations in code
        return a.pk # integer value

application = Application([NewIncidenceService],
    tns=http://service/service.wsdl',
    in_protocol=Soap11(validator='lxml'),
    out_protocol=Soap11(cleanup_namespaces=True)
)

createSop_app = csrf_exempt(DjangoApplication(application))

С этим кодом все в порядке, и мой wsdl сгенерирован так:

<wsdl:definitions xmlns:wsa="http://schemas.xmlsoap.org/ws/2003/03/addressing" xmlns:tns="http://localhost/DEMAT/DEMAT_IncidenceManagement/service.wsdl" xmlns:plink="http://schemas.xmlsoap.org/ws/2003/05/partner-link/" xmlns:xop="http://www.w3.org/2004/08/xop/include" xmlns:soap12env="http://www.w3.org/2003/05/soap-envelope/" xmlns:senc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:senv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soap12enc="http://www.w3.org/2003/05/soap-encoding/" targetNamespace="http://localhost/DEMAT/DEMAT_IncidenceManagement/service.wsdl" name="Application">...</wsdl:definitions>

Теперь мне нужны эти изменения:

Во-первых, если я попробую этот источник:

class ResponseData(ComplexModel):
    message = Unicode
    codResultado = Integer


class CreateIncidenceService(ServiceBase):
    @rpc(SopoSoap, _returns=ResponseData)
    def NewIncidence(sop):
        try:
            # operations
            return ResponseData

Я никогда не получаю ответ моего сервера (Apache с django - wsgi.py), что мне нужно изменить декоратор rpc? тип возврата, где я могу найти хороший пример документации для чайников?

Во-вторых. Это очень важно для меня, мне нужно изменить имя определенных элементов в wsdl, например:

<xs:complexType name="NewIncidenceResponse">
or this others:
<wsdl:message name="NewIncidence">
<wsdl:part name="NewIncidence" element="tns:NewIncidence"/>
</wsdl:message>
<wsdl:message name="NewIncidenceResponse">
<wsdl:part name="NewIncidenceResponse" element="tns:NewIncidenceResponse"/>
</wsdl:message>

Имя, только имя, я полагаю, это должно быть очень просто, потому что в Java или.net вы можете без проблем изменить имя этих параметров, но с этой библиотекой я не знаю, как мне это сделать?

В-третьих, я хотел бы вернуть complexType со структурой из 3 полей:

а) код б) сообщение в) исключение: здесь я не знаю, как я могу вернуть исключение в wsdl.

Для этих 3 полей я подумал в созданном мной классе responseData, но не могу получить данные этого типа. Я знаю, что задаю 3 вопроса, но я читал всю документацию Spyne, и я не нашел ничего для своих проблем.

1 ответ

Решение

Во-первых, спасибо за попытку Spyne!

ответы:

  1. Пытаться

    return ResponseData(codResultado=1234, message="Hello!")
    
  2. Проходить _out_response_name в @rpc

  3. Не изобретайте свои и используйте встроенный Fault учебный класс.

Да, документы Spyne плохие, но они НЕ ТАК плохие. Читать их:)

Spyne также имеет список рассылки: http://lists.spyne.io/listinfo/people

Hth,

Другие вопросы по тегам