根据特定的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:有关引起验证问题的变量的通知):
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!")
这是不可能的(尚未完成), 维护者在此处也回答了类似的问题。
解决方法是将侦听器添加到“ 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>")