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

2024-10-01 15:32:31 发布

您现在位置:Python中文网/ 问答频道 /正文

Moodle LMS可以用来测试学生。一种可选的问题类型(不透明)使用SOAP从服务请求问题(代码位于https://goo.gl/iGDIiy)。你知道吗

有一个在PHP中使用在https://goo.gl/kESENq中定义的WSDL实现的工作“问题服务器”

我遇到的复杂情况是,问题类型中的代码期望一些返回值是字符串。正在运行的测试服务器的响应看起来像。。。你知道吗

<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;

请注意缺少string类型修饰符。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生成该格式。通过阅读decorator函数的源代码,我认为我做不到。你知道吗

那么,这是一个编码不好的客户机还是预期的SOAP模式正常?如何让Spyne(或ZIS)生产类似的产品?你知道吗


Tags: 对象字符串代码ltgt服务器类型string

热门问题