PHP SOAP 和 Python SOAP 库之间的兼容性

Compatibility between PHP SOAP and Python SOAP libraries

Moodle LMS 可用于对学生进行测验。一种可选的问题类型(不透明)使用 SOAP 从服务请求问题(https://goo.gl/iGDIiy 处的代码)。

在 PHP 中使用在 https://goo.gl/kESENq

中定义的 WSDL 实现了一个有效的 "question server"

我 运行 遇到的问题是问题类型中的代码期望一些 return 值是一个字符串。来自功能测试服务器的响应看起来像...

<SOAP-ENV:Body>                                                                 
<ns1:getEngineInfoResponse>                                                     
<getEngineInfoReturn xsi:type="SOAP-ENC:string">                                
&lt;engineinfo&gt;

注意 xsi:type=..string。 return 应用程序 PHP 将数据实际 return 编辑为 XML 格式的字符串:

/**                                                                         
 * A dummy implementation of the getEngineInfo method.                      
 * @return string of XML.                                                   
 */                                                                         
public function getEngineInfo() {                                           
    return '<engineinfo>                                                    

我正在尝试将其连接到 Python+SOAP 服务器。我试过同时使用 ZSI 和 Spyne。对于 ZSI,我使用示例服务器提供的 WSDL 来生成代码存根。相应的代码只是 return 一个字符串,很像 PHP 代码。回复是:

<ns1:getEngineInfoResponse>                                                     
<getEngineInfoReturn>                                                           
&lt;engineinfo&gt;

注意缺少字符串类型修饰符。此响应由 Moodle 中的 PHP 代码作为一个对象接收,该对象包含没有名称但包含 returned XML 字符串的单个字段。因为它是一个包含字符串的对象,而不仅仅是一个字符串,所以代码无法正确解析结果。

使用 Spyne,我得到:

soap11env:Body>                                                                
<tns:getEngineInfoResponse>                                                     
<tns:getEngineInfoReturn>&lt;engineinfo&gt; 

来自此代码:

@srpc(_returns=String, _body_style='wrapped',                               
      _out_variable_name="getEngineInfoReturn"                              
)                                                                           
def getEngineInfo():                                                        
    resp = "<engineinfo>\n"                                                 

这也是 return 一个对象,该对象具有包含适当字符串的单个元素(现在名为 getEngineInfoReturn)。 然而,接收方(对生成的 WSDL 感到满意) 仍然需要一个字符串而不是一个包含字符串的对象。

与 ZSI 版本相比,我更愿意使用 Spyne 版本,因为它更易于使用。我以前使用过 SOAP,但不确定 PHP 代码是否对 return 格式做出了无根据的假设,或者我是否应该能够强制 Spyne 生成该格式。看了装饰器函数的源码,我觉得不行。

那么,这是客户端编码不当还是预期的 SOAP 模式正常?我怎样才能让 Spyne(或 ZIS)产生类似的东西?

_out_body_style='bare'传递给@rpc。