PHP SOAP 和 Python SOAP 库之间的兼容性
Compatibility between PHP SOAP and Python SOAP libraries
Moodle LMS 可用于对学生进行测验。一种可选的问题类型(不透明)使用 SOAP 从服务请求问题(https://goo.gl/iGDIiy 处的代码)。
在 PHP 中使用在 https://goo.gl/kESENq
中定义的 WSDL 实现了一个有效的 "question server"
我 运行 遇到的问题是问题类型中的代码期望一些 return 值是一个字符串。来自功能测试服务器的响应看起来像...
<SOAP-ENV:Body>
<ns1:getEngineInfoResponse>
<getEngineInfoReturn xsi:type="SOAP-ENC:string">
<engineinfo>
注意 xsi:type=..string。 return 应用程序 PHP 将数据实际 return 编辑为 XML 格式的字符串:
/**
* A dummy implementation of the getEngineInfo method.
* @return string of XML.
*/
public function getEngineInfo() {
return '<engineinfo>
我正在尝试将其连接到 Python+SOAP 服务器。我试过同时使用 ZSI 和 Spyne。对于 ZSI,我使用示例服务器提供的 WSDL 来生成代码存根。相应的代码只是 return 一个字符串,很像 PHP 代码。回复是:
<ns1:getEngineInfoResponse>
<getEngineInfoReturn>
<engineinfo>
注意缺少字符串类型修饰符。此响应由 Moodle 中的 PHP 代码作为一个对象接收,该对象包含没有名称但包含 returned XML 字符串的单个字段。因为它是一个包含字符串的对象,而不仅仅是一个字符串,所以代码无法正确解析结果。
使用 Spyne,我得到:
soap11env:Body>
<tns:getEngineInfoResponse>
<tns:getEngineInfoReturn><engineinfo>
来自此代码:
@srpc(_returns=String, _body_style='wrapped',
_out_variable_name="getEngineInfoReturn"
)
def getEngineInfo():
resp = "<engineinfo>\n"
这也是 return 一个对象,该对象具有包含适当字符串的单个元素(现在名为 getEngineInfoReturn)。
然而,接收方(对生成的 WSDL 感到满意)
仍然需要一个字符串而不是一个包含字符串的对象。
与 ZSI 版本相比,我更愿意使用 Spyne 版本,因为它更易于使用。我以前使用过 SOAP,但不确定 PHP 代码是否对 return 格式做出了无根据的假设,或者我是否应该能够强制 Spyne 生成该格式。看了装饰器函数的源码,我觉得不行。
那么,这是客户端编码不当还是预期的 SOAP 模式正常?我怎样才能让 Spyne(或 ZIS)产生类似的东西?
将_out_body_style='bare'
传递给@rpc。
Moodle LMS 可用于对学生进行测验。一种可选的问题类型(不透明)使用 SOAP 从服务请求问题(https://goo.gl/iGDIiy 处的代码)。
在 PHP 中使用在 https://goo.gl/kESENq
中定义的 WSDL 实现了一个有效的 "question server"我 运行 遇到的问题是问题类型中的代码期望一些 return 值是一个字符串。来自功能测试服务器的响应看起来像...
<SOAP-ENV:Body>
<ns1:getEngineInfoResponse>
<getEngineInfoReturn xsi:type="SOAP-ENC:string">
<engineinfo>
注意 xsi:type=..string。 return 应用程序 PHP 将数据实际 return 编辑为 XML 格式的字符串:
/**
* A dummy implementation of the getEngineInfo method.
* @return string of XML.
*/
public function getEngineInfo() {
return '<engineinfo>
我正在尝试将其连接到 Python+SOAP 服务器。我试过同时使用 ZSI 和 Spyne。对于 ZSI,我使用示例服务器提供的 WSDL 来生成代码存根。相应的代码只是 return 一个字符串,很像 PHP 代码。回复是:
<ns1:getEngineInfoResponse>
<getEngineInfoReturn>
<engineinfo>
注意缺少字符串类型修饰符。此响应由 Moodle 中的 PHP 代码作为一个对象接收,该对象包含没有名称但包含 returned XML 字符串的单个字段。因为它是一个包含字符串的对象,而不仅仅是一个字符串,所以代码无法正确解析结果。
使用 Spyne,我得到:
soap11env:Body>
<tns:getEngineInfoResponse>
<tns:getEngineInfoReturn><engineinfo>
来自此代码:
@srpc(_returns=String, _body_style='wrapped',
_out_variable_name="getEngineInfoReturn"
)
def getEngineInfo():
resp = "<engineinfo>\n"
这也是 return 一个对象,该对象具有包含适当字符串的单个元素(现在名为 getEngineInfoReturn)。 然而,接收方(对生成的 WSDL 感到满意) 仍然需要一个字符串而不是一个包含字符串的对象。
与 ZSI 版本相比,我更愿意使用 Spyne 版本,因为它更易于使用。我以前使用过 SOAP,但不确定 PHP 代码是否对 return 格式做出了无根据的假设,或者我是否应该能够强制 Spyne 生成该格式。看了装饰器函数的源码,我觉得不行。
那么,这是客户端编码不当还是预期的 SOAP 模式正常?我怎样才能让 Spyne(或 ZIS)产生类似的东西?
将_out_body_style='bare'
传递给@rpc。