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">
<engineinfo>
请注意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>
<engineinfo>
注意缺少字符串类型修饰符。 Moodle中的PHP代码将此响应作为包含单个字段的对象接收,该字段没有名称但包含返回的XML字符串。因为它是一个包含字符串的对象,而不仅仅是一个字符串,所以代码无法正确解析结果。
通过Spyne,我得到了:
soap11env:Body>
<tns:getEngineInfoResponse>
<tns:getEngineInfoReturn><engineinfo>
来自此代码:
@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 :(得分:0)
将_out_body_style='bare'
传递给@rpc。