Python Web 服务开发者: Python SOAP 库,第 4 部分
2008-09-30 13:02:58 来源:WEB开发网Richard Hastings 的 Air Fare Quote Search 是用 Apache Axis 实现的,可以用来搜索一些实时的航班 Web 站点,以查找特定航线最合适的机票价格(请参见 参考资料)。它收集并返回按照价格分类的结果。WSDL 位于 http://wavendon.dsdata.co.uk:8080/axis/services/SBGGetAirFareQuote?wsdl。它定义了两个操作: getAirFareQuote 和 getAirlines 。前者用于执行价格搜索,使用 4 个参数:两个 W3C XML Schema Language Data Types(WXSDT) dateTime 值,给出了航班出发以及到达的大概时间,两个 WXSDT string 值,给出了三个字母组成的飞机往返机场的代码。在交互式的 Python 中,我们尝试了如下代码:
>>> from ZSI import ServiceProxy
>>> wsdl = 'http://wavendon.dsdata.co.uk:8080
... /axis/services/SBGGetAirFareQuote?wsdl'
>>> proxy = ServiceProxy(wsdl)
ZSI 手册中的示例也展示了如何将 typesmodule 关键字参数用于 ServiceProxy 初始化器,但是还没有适当地解释这个参数,所以我们忽略它。
日期问题
我们需要将两个 date/time 对象用于服务调用,而且 ZSI 手册指出:“SOAP 日期和时间是用 UTC(GMT)表示的 Python 时间元组,与 Python 时间模块中所记录的一样”。我们尝试过用以下代码来查看参加在费城举行的 XML 2003 大会的花费是多少。
>>> import time
>>> ISO_8601_DATETIME = '%Y-%m-%dT%H:%M:%S'
>>> dep = time.strptime('2003-12-06T12:30:59', ISO_8601_DATETIME)
>>> ret = time.strptime('2003-12-12T12:30:59', ISO_8601_DATETIME)
>>> proxy.getAirFareQuote(dep, ret, 'den', 'phl')
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "/usr/lib/python2.2/site-packages/ZSI/ServiceProxy.py", line 82, in __call__
return self.parent()._call(self.__name__, *args, **kwargs)
File "/usr/lib/python2.2/site-packages/ZSI/ServiceProxy.py", line 65, in _call
apply(getattr(binding, callinfo.methodName), args)
File "/usr/lib/python2.2/site-packages/ZSI/client.py", line 28, in __call__
requesttypecode=TC.Any(self.name, aslist=1))
File "/usr/lib/python2.2/site-packages/ZSI/client.py", line 131, in RPC
self.Send(url, opname, obj, **kw)
File "/usr/lib/python2.2/site-packages/ZSI/client.py", line 169, in Send
sw.serialize(obj, tc, typed=0)
File "/usr/lib/python2.2/site-packages/ZSI/writer.py", line 73, in serialize
typecode.serialize(self, pyobj, **kw)
File "/usr/lib/python2.2/site-packages/ZSI/TC.py", line 282, in serialize
Any().serialize(sw, val)
File "/usr/lib/python2.2/site-packages/ZSI/TC.py", line 315, in serialize
raise EvaluateException('''Any can't serialize ''' +
ZSI.EvaluateException: Any can't serialize (2003, 12, 6, 12, 30, 59, 5, 340, 0)
更多精彩
赞助商链接