Python Web 服务开发人员: 现实世界,第一部分
2007-03-29 12:42:00 来源:WEB开发网更好的方法
尽管直接使用 XML 构造 SOAP 请求,接着解析 XML SOAP 响应,是相当简单的,但是还有几个更高层次的库,它们提供了更加强大和直观的接口。在本专栏前面的讨论中已经探讨了一些这样的接口。尽管 Google Web API 是非常简单的,任何支持复杂类型的 SOAP 库或许都能够正常运行,但是我们将使用 Python 的 SOAPpy 库来与 Google Web 服务交谈。
在这个方法中,我们使用 SOAPProxy 来创建一个 Web 服务的代理(参见 清单5)。通过此 SOAP 代理,我们可以直接调用 Google Web API 上公开的方法——在本例中为 doGoogleSearch( ) 。SOAPpy 以透明的方式处理字符串和整型参数(key、q、start、maxResults、restrict、lr、ie 和 oe)的编组(marshall)。但是,我们必须显式地编组布尔型的数值(filter 和 safeSearch)。注意,根据 Google Web API 文档,最后的两个参数(ie 和 oe)不再使用,因此需要忽略。如果成功地调用了远程方法,SOAPProxy 会自动解析包含结果的 SOAP 对象来创建一个 Python 对象,这个 Python 对象与 WSDL 文档中所描述的结构相匹配。对结果对象的访问是直接通过 Python 属性进行的。
另外, SOAPpy 有一个调试模式,在 SOAPpy 安装中的 Config.py 的第 68 行,将 self.debug 更改为 1,这样就可以启用这个模式(在 *NIXes上,Config.py 文件位于:/usr/lib/Python2.2/site-packages/SOAPpy)。不幸的是,没有别的方法来启用这个特性。在启动了调试模式之后,所有在调用时交换的 HTTP Header 和原始 SOAP XML 将转处到到 stdout 中。
清单5. 使用 SOAPpy 来访问 Google API
from SOAPpy import SOAPProxy
from SOAPpy import Types
# CONSTANTS
_url = 'http://api.google.com/search/beta2'
_namespace = 'urn:GoogleSearch'
# need to marshall into SOAP types
SOAP_FALSE = Types.booleanType(0)
SOAP_TRUE = Types.booleanType(1)
# create SOAP proxy object
google = SOAPProxy(_url, _namespace)
# Google search options
_license_key = 'INSERT YOUR KEY HERE'
_query = 'spotted owl'
_start = 0
_maxResults = 10
_filter = SOAP_FALSE
_restrict = ''
_safeSearch = SOAP_FALSE
_lang_restrict = ''
# call search method over SOAP proxy
results = google.doGoogleSearch( _license_key, _query,
_start, _maxResults,
_filter, _restrict,
_safeSearch, _lang_restrict, '', '' )
# display results
print 'google search for " ' + _query + ' "\n'
print 'estimated result count: ' + str(results.estimatedTotalResultsCount)
print ' search time: ' + str(results.searchTime) + '\n'
print 'results ' + str(_start + 1) + ' - ' + str(_start + _maxResults) +':\n'
numresults = len(results.resultElements)
for i in range(numresults):
title = results.resultElements[i].title
noh_title = title.replace('<b>', '').replace('</b>', '')
print 'title: ' + noh_title
print ' url: ' + results.resultElements[i].URL + '\n'
更多精彩
赞助商链接