在Python中实现简约的SOAP服务器方法
我需要做一个小工具,用来处理非常简单的SOAP XML(HTTP POST)消息。这是一种我必须支持的协议,而使用SOAP并不是我自己选择的(只是想避免那些“你为什么用协议X?”的回答)。
我想用已经在基本的Python 2.6.x安装包里的东西。最简单的方法是什么?这个SOAP消息真的很简单,我希望尽量不使用像WSDL类生成这样的复杂工具。
我之前在Ruby中实现过类似的功能,只用了普通的HTTPServlet::AbstractServlet和REXML解析器,效果很好。
我想在Python中用BaseHTTPServer、BaseHTTPRequestHandler和elementree解析器做一个类似的解决方案,但我不太清楚怎么读取我收到的SOAP POST消息的内容。我觉得文档写得不是很好。
2 个回答
我在Boo语言中写了类似的东西,使用了.Net的HTTPListener,因为我也需要实现别人定义的WSDL。
我得到的WSDL使用的是文档/字面形式(如果你的WSDL使用的是rpc/编码形式,你需要对这些信息做一些调整)。我把HTTPListener封装在一个类里面,这样客户端代码就可以通过SOAP动作来注册回调函数,然后给这个类添加了一个启动方法,用于启动HTTPListener。在Python中,你也可以做类似的事情,使用BaseHTTPServer中的getPOST()方法来:
- 从HTTP头中提取SOAP动作
- 使用elementtree从POST的HTTP中提取SOAP头和SOAP体
- 调用为SOAP动作定义的回调函数,并传入这些提取的值
- 返回回调函数给出的响应文本,并放在相应的SOAP信封中;如果回调函数抛出异常,捕获它并重新包装成SOAP故障
然后你只需要为每个SOAP动作实现一个回调函数,这个函数会接收到传递给它的XML内容,使用elementtree解析这些内容,执行所需的操作(如果是测试的话可以执行模拟操作),并构建必要的响应XML(我不介意直接用字符串插值来创建这个,但你也可以使用elementtree通过序列化一个Python响应对象来创建它)。
如果你能获得一些真实的SOAP示例消息,会对你很有帮助,这样可以避免你抓狂,特别是在创建必要的响应XML时。
你可以写一个WSGI函数(可以参考wsgiref
),然后在这个函数里用xml.etree.ElementTree
模块来解析HTTP请求的内容。
SOAP其实很简单,我觉得没必要专门为它写一个模块。你可以直接使用你喜欢的标准XML处理库。