Модифицировать 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!
ответы:
Пытаться
return ResponseData(codResultado=1234, message="Hello!")
Проходить
_out_response_name
в@rpc
Не изобретайте свои и используйте встроенный
Fault
учебный класс.
Да, документы Spyne плохие, но они НЕ ТАК плохие. Читать их:)
Spyne также имеет список рассылки: http://lists.spyne.io/listinfo/people
Hth,