2015-03-03 9 views
2

Внедрение WebService в соответствии с определенным WSDL. Клиент не может быть изменен. Правильно обрабатывать запрос от Клиента, но Клиент жалуется на Response из-за пространства имен в переменных.Удалить пространство имен из переменных ответа Spyne

То, что я хочу (ответ SoapUI, основанный на WSDL):

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:cal="http://callback.foo.com/"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <cal:foo_statusResponse> 
     <result>SUCCESS</result> 
     <notify>Thanks!</notify> 
     </cal:foo_statusResponse> 
    </soapenv:Body> 
</soapenv:Envelope> 

Что я получаю (уведомление tns: от переменных вызывает проблемы проверки):

<senv:Envelope xmlns:tns="http://callback.foo.com/" xmlns:senv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <senv:Body> 
    <tns:foo_statusResponse> 
     <tns:result>SUCCESS</tns:result> 
     <tns:notify>Thanks!</tns:notify> 
    </tns:foo_statusResponse> 
    </senv:Body> 
</senv:Envelope> 

клиента Java выбрасывает это исключение:

[com.sun.istack.SAXParseException2; lineNumber: 2; columnNumber: 162; неожиданный элемент (uri: "http://callback.foo.com/", local: "result"). Ожидаемые элементы < {} результат> < {} уведомит>] сниппет

Реализация:

class fooStatusRS(ComplexModel): 
    result = Unicode() 
    notify = Unicode() 

class foo_callback(ServiceBase): 
    @srpc(Unicode, Unicode, Unicode, Unicode, statusbarInfo, anotherResponse, 
      _out_header=None, 
      _out_variable_names=("result", "notify"), 
      _returns=(Unicode, Unicode), 
      _out_message_name="foo_statusResponse", 
      _operation_name="foo_status_rq") 
    def foo_status(foo_id, reply, ref, status, statusbar, another): 
     if foo_id: 
      print foo_id 

     return fooStatusRS(result="SUCCESS", notify="Foo received!") 

ответ

1

Это не возможно (пока) и ответил на подобный вопрос here по сопровождающий.

Работа должна состоять в том, чтобы добавить слушателя к event_manager для «method_return_string», а затем выполнить некоторые строковые операции.

def _method_return_string(ctx): 
    ctx.out_string[0] = ctx.out_string[0].replace("tns:result>", "result>") 
    ctx.out_string[0] = ctx.out_string[0].replace("tns:notify>", "notify>") 
0

это может быть исправлено путем переопределения nsmap в application.interface

def fix_nsmap(application): 
     conversion_dict = { 
      'tns': None, 
      'senv': 'soap', 
     } 
     nsmap = application.interface.nsmap 
     for k, v in conversion_dict.iteritems(): 
      nsmap[v] = nsmap[k] 
      del nsmap[k] 

     application.interface.nsmap = nsmap 

    application_security2 = Application(
     [Security2Service], 
     tns=NS, 
     name='Security2', 
     in_protocol=Soap11(), 
     out_protocol=Soap11() 
    ) 

    fix_nsmap(application_security2) 

nsmap [Нет] установлено значение по умолчанию NS

+0

application.interface - устаревшая синхронизация не менее 2.10: http://spyne.io/docs/2.10/reference/application.html – blueCat

+0

это не https://github.com/arskom/spyne/blob/master /spyne/application.py#L107 – thebat

0

Если вам интересно, как добавить слушателя к event_manager для method_return_string, см. полный пример:

from spyne import Application, rpc, ServiceBase, Iterable, Integer, Unicode 

from spyne.protocol.soap import Soap11 
from spyne.server.wsgi import WsgiApplication 


class HelloWorldService(ServiceBase): 
    @rpc(Unicode, Integer, _returns=Iterable(Unicode)) 
    def say_hello(ctx, name, times): 
     for i in range(times): 
      yield u'Hello, %s' % name 


def on_method_return_string(ctx): 
    ctx.out_string[0] = ctx.out_string[0].replace(b'Hello>', b'Good by') 

HelloWorldService.event_manager.add_listener('method_return_string', 
               on_method_return_string) 

application = Application([HelloWorldService], 'spyne.examples.hello.soap', 
          in_protocol=Soap11(validator='lxml'), 
          out_protocol=Soap11()) 

wsgi_application = WsgiApplication(application) 


if __name__ == '__main__': 
    import logging 

    from wsgiref.simple_server import make_server 
    server = make_server('127.0.0.1', 8000, wsgi_application) 
    server.serve_forever() 

As of Spyne 2.12 это все еще включено способ удаления пространств имен из переменных ответа.

Смежные вопросы