从 Spyne 响应变量中删除命名空间 [英] Remove the namespace from Spyne response variables

查看:26
本文介绍了从 Spyne 响应变量中删除命名空间的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

根据特定的 WSDL 实现 WebService.客户端无法更改.正确处理来自客户端的请求,但由于变量中的命名空间,客户端抱怨响应.

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.

我想要的(基于 WSDL 的 soapUI 响应):

<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: 关于导致验证问题的变量):

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

<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;行号:2;列数:162;意外元素(uri:"http://callback.foo.com/", local:"result").预期元素为 <{}result>,<{}notify>]

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

实现片段:

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

推荐答案

这是不可能的(目前)并且在类似的问题中得到了回答 此处 由维护者提供.

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

解决方法是为method_return_string"向 event_manager 添加侦听器,然后执行一些字符串操作.

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

这篇关于从 Spyne 响应变量中删除命名空间的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆