从Spyne响应变量中删除名称空间

发布于 2021-01-29 15:01:00

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

我想要什么(基于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:有关引起验证问题的变量的通知):

<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/,本地:“结果”))。期望的元素是<{}
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!")
关注者
0
被浏览
121
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    这是不可能的(尚未完成), 维护者在此处也回答了类似的问题。

    解决方法是将侦听器添加到“ method_return_string”的event_manager中,然后执行一些字符串操作。

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


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看