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">
<engineinfo>
请注意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>
<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)产生类似的东西?
将_out_body_style='bare'
传递给@rpc。
或多或少正确 - 需要在spyne 2.11中_body_style ='out_bare' –
'_out_body_style ='bare''是否会返回所需的内容? –
看起来就像这样 - 我已经看过_body_style ='bare'的文档,并尝试过,但没有奏效。我需要的确切格式是_body_style ='out_bare',它似乎只是从WSDL中的输出中去掉 。我有第二个问题,我没有意识到应用程序正在缓存WSDL,因此需要强制更新。 –