【问题标题】:Compatibility between PHP SOAP and Python SOAP librariesPHP SOAP 和 Python SOAP 库之间的兼容性
【发布时间】:2016-03-06 16:37:21
【问题描述】:

Moodle LMS 可用于对学生进行测验。一种可选的问题类型(不透明)使用 SOAP 向服务请求问题(代码位于 https://goo.gl/iGDIiy)。

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

我遇到的复杂情况是问题类型中的代码期望某些返回值是字符串。来自正常运行的测试服务器的响应看起来像......

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

注意 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>                                                           
&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)产生类似的东西?

【问题讨论】:

  • _out_body_style='bare' 是否返回您需要的内容?
  • 看起来确实如此 - 我已经看过 _body_style='bare' 的文档并尝试过,但这没有用。我需要的确切格式是 _body_style='out_bare',这似乎只是从 WSDL 的输出中去除了 。我有一个次要问题,我没有意识到应用程序正在缓存 WSDL,因此需要强制更新。

标签: php python soap spyne zsi


【解决方案1】:

_out_body_style='bare' 传递给@rpc。

【讨论】:

  • 或多或少正确 - 在 spyne 2.11 中需要 _body_style='out_bare'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-18
  • 1970-01-01
  • 2020-12-27
  • 1970-01-01
  • 2019-11-12
相关资源
最近更新 更多