Python中SOAP服务器的极简主义,非企业方法

时间:2009-10-10 09:49:47

标签: python http soap

我需要实现一个小型测试实用程序,它消耗极其简单的SOAP XML(HTTP POST)消息。这是我必须支持的协议,并不是我的设计决定使用SOAP(只是试图阻止那些“你为什么使用协议X?”答案)

我想使用已经在基本的python 2.6.x安装中的东西。最简单的方法是什么?唯一的SOAP消息非常简单,如果可能的话,我宁愿不使用像WSDL类生成这样的任何企业工具。

我之前在Ruby中使用普通的HTTPServlet :: AbstractServlet和REXML解析器实现了相同的功能。工作得很好。

我认为我可以使用BaseHTTPServer,BaseHTTPRequestHandler和elementree解析器在Python中使用类似的解决方案,但对于我如何阅读传入的SOAP POST消息的内容并不明显。文档不是那么好的恕我直言。

2 个答案:

答案 0 :(得分:3)

您可以编写WSGI函数(请参阅wsgiref)并使用xml.etree.ElementTree模块在​​其中解析HTTP请求正文。

SOAP基本上非常简单,我不确定它是否值得一个特殊的模块。只需使用您喜欢的标准XML处理库。

答案 1 :(得分:1)

我在Boo中使用.Net HTTPListener编写了类似的东西,因为我也必须实现别人定义的WSDL。

我给出的WSDL使用了document / literal形式(如果你的WSDL使用rpc / encoded,你需要对这些信息做一些调整)。我将HTTPListener包装在一个类中,该类允许客户端代码通过SOAP操作注册回调,然后为该类提供一个启动HTTPListener的Start方法。您应该可以在Python中执行非常类似的操作,在BaseHTTPServer上使用getPOST()方法:

  • 从HTTP中提取SOAP操作 头
  • 使用elementtree提取SOAP POST的标题和SOAP正文 HTTP
  • 调用已定义的回调函数 SOAP动作,发送这些提取的值
  • 返回由。给出的响应文本 在相应的SOAP中回调 信封;如果回调引发了 异常,抓住它并重新包装它 一个SOAP错误

然后你只需要为每个SOAP操作实现一个回调,它获取传递给它的XML内容,用elementtree解析它,执行所需的操作(如果这是测试人员,则执行模拟操作),并构造必要的响应XML(我是不太自豪只是使用字符串插值显式创建它,但您可以使用elementtree通过序列化Python响应对象来创建它。)

如果您可以获得一些真正的SOAP示例消息以帮助您不撕掉头发,这将有所帮助,尤其是在您创建必要的响应XML的部分。