c4talyst c4talyst - 1 year ago 244
Python Question

Remove the namespace from Spyne response variables

Implementing a WebService according to a specific WSDL. Client cannot be changed. Correctly processing request from Client, but Client is complaining on Response because of namespace in variables.

What I want (soapUI response based on WSDL):

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:cal="http://callback.foo.com/">

What I am getting (notice
on variables causing validation issues):

<senv:Envelope xmlns:tns="http://callback.foo.com/" xmlns:senv="http://schemas.xmlsoap.org/soap/envelope/">

Java Client is throwing this exception:

[com.sun.istack.SAXParseException2; lineNumber: 2; columnNumber: 162;
unexpected element (uri:"http://callback.foo.com/", local:"result").
Expected elements are <{}result>,<{}notify>]

Implementation snippet:

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

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

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

Answer Source

This is not possible (yet) and is answered in a similar question here by the maintainer.

The work around was to add listener to the event_manager for "method_return_string" and then perform some string operations.

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>")
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download