Entfernen Sie den Namespace aus Spyne-Antwortvariablen

Implementierung eines WebService nach einer bestimmten WSDL. Client kann nicht geändert werden. Richtige Bearbeitung der Anforderung vom Client, aber Client klagt auf Response wegen Namensraum in Variablen.

Was ich will (soapUI Antwort auf WSDL):

  • Liste aller Klassifizierungsalgorithmen
  • Extrahieren Sie Traceback-Info aus einem Exception-Objekt
  • F2py: Belichtungsparameter aus "gebrauchten" Modulen
  • Stack-Bar-Plot in Matplotlib und Etikett zu jedem Abschnitt hinzufügen (und Vorschläge)
  • Verwenden Sie ipdb statt pdb mit py.test --pdb Option
  • Python struct pack doppeltes
  • <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> 

    Was ich tns: (beachten Sie tns: auf Variablen, die Validierungsprobleme verursachen):

     <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-Client wirft diese Ausnahme aus:

    [Com.sun.istack.SAXParseException2; LineNumber: 2; SpalteNummer: 162; Unerwartetes Element (uri: " http://callback.foo.com/ ", lokal: "Ergebnis"). Erwartete Elemente sind <{} Ergebnis>, <{} benachrichtigen>]

    Implementierungs-Snippet:

     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!") 

  • "Ein gültiges Datum eingeben" Fehler in Django Forms DateField
  • Google App Engine: Python: WebOb: Wie bekomme ich POST-Daten im JSON-Format?
  • Wie kann ich die FROM-Tabellen in SQLAlchemy-Unterabfragen angeben?
  • Wie man das kartesische Produkt iteriert, so dass Top-Artikel zuerst kombinieren?
  • Berechnen der Standardabweichung in einem Stream
  • Tupelwert durch Schlüssel
  • 3 Solutions collect form web for “Entfernen Sie den Namespace aus Spyne-Antwortvariablen”

    Dies ist nicht möglich (noch) und wird in einer ähnlichen Frage hier vom Betreuer beantwortet.

    Die Arbeit war, um den Listener zum Event_manager für "method_return_string" hinzuzufügen und dann einige Stringoperationen auszuführen.

     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>") 

    Es kann durch übergeordnetes nsmap in application.interface behoben werden

      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 [Keine] setzt die Standard-NS

    Wenn Sie sich fragen, wie Sie dem Event_manager für method_return_string einen Zuhörer hinzufügen method_return_string , siehe method_return_string ein vollständiges Beispiel:

     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() 

    Ab Spyne 2.12 ist dies immer noch der einzige Weg, um Namespaces aus Antwortvariablen zu entfernen.

    Python ist die beste Programmiersprache der Welt.