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

时间:2016-03-06 16:37:21

标签: php python soap spyne zsi

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

有一个工作"问题服务器"使用在https://goo.gl/kESENq

定义的WSDL在PHP中实现

我遇到的复杂问题是问题类型中的代码期望某些返回值为字符串。功能测试服务器的响应看起来像......

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

请注意xsi:type = .. string。实际上,PHP应用程序将数据作为XML格式的字符串返回:

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

我试图将其与Python + SOAP服务器连接起来。我尝试过使用ZSI和Spyne。使用ZSI,我使用示例服务器提供的WSDL来生成代码存根。相应的代码只返回一个很像PHP代码的字符串。这样的回应是:

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

注意缺少字符串类型修饰符。 Moodle中的PHP代码将此响应作为包含单个字段的对象接收,该字段没有名称但包含返回的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"                                                 

这也会返回一个包含相应字符串的单个元素(现在名为getEngineInfoReturn)的对象。 然而,接收器(对WSDL产生满意) 仍然需要一个字符串,而不是一个包含字符串的对象。

我宁愿让Spyne版本比ZSI版本更有效,因为它更容易使用。我之前使用过SOAP,但我不确定PHP代码是否对返回格式做出了无根据的假设,或者我是否应该将Spyne用于生成该格式。从阅读装饰函数的源代码,我不认为我可以。

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

1 个答案:

答案 0 :(得分:0)

_out_body_style='bare'传递给@rpc。