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

问题描述:

Moodle LMS可用于测验学生。一个可选的问题类型(Opaque)使用SOAP从服务请求问题(代码https://goo.gl/iGDIiy)。PHP SOAP和Python SOAP库之间的兼容性

有工作“的问题服务器”使用在https://goo.gl/kESENq

,我运行到复杂定义的WSDL PHP实现的是,在问题类型的代码预期的一些返回值是一个字符串。从功能测试服务器的响应看起来像...

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

请注意xsi:type = ..字符串。该数据实际上返回由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)产生类似的东西?

+0

'_out_body_style ='bare''是否会返回所需的内容? –

+0

看起来就像这样 - 我已经看过_body_style ='bare'的文档,并尝试过,但没有奏效。我需要的确切格式是_body_style ='out_bare',它似乎只是从WSDL中的输出中去掉。我有第二个问题,我没有意识到应用程序正在缓存WSDL,因此需要强制更新。 –

_out_body_style='bare'传递给@rpc。

+0

或多或少正确 - 需要在spyne 2.11中_body_style ='out_bare' –