发出异步请求并不意味着只是与您自己的服务器端程序交互。其实也可以与一些公共API,例如来自Google或Amazon的API进行通信,从而为Web应用程序增加您自己的脚本和服务器端程序所不能提供的更多功能。在本文中,BrettMcLaughlin教您如何向公共API,例如Google提供的API发出请求并接收其响应。到目前为止,这个系列只涉及到客户机Web页面向服务器端脚本和程序发出请求的情况。这就是大约80%到90%的Ajax应用程序(使用XMLHttpRequest对象的异步Web应用程序)的工作方式。然而,这种方法有很严重的局限性:您将受到自己才智和编程技能的限制,就算不是这样,最起码也要受到公司团队中的程序员的才智和编程技能的限制。有时候,您确实想实现一些功能,但是又不具备实现该目标所需的技术知识,几乎总能遇到这种情况。也许您不知道某些语法,也许不知道如何找出适当的算法。还有些时候,您手头上可能没有用于满足需求的数据或资源(无论是人力资源还是数据资源)。在这些情况下,也许您会想:唉,要是我能使用其他人的代码该多好啊!本文就是要解决这个问题。开放源码脚本和程序在论述本文的实际内容(在Web应用程序中使用公共API)之前,有必要说一说开放源码脚本和程序。浅显地讲,开放源码是用于描述可以在一定程度上免费在您自己的应用程序中使用和重用的代码的一个术语。相关链接请参阅参考资料。简言之,您可以获取别人编写的开放源码,然后将其放入自己的环境中,而不必为之付费,也不会受到(很多)限制。如果使用开放源码,那么有时候需要为应用程序增加额外的文档,或者将您对开放源码程序或脚本作出的更改反馈给社区。不管如何使用这种程序,最终结果就是,您可以使用这么一块代码:该代码是您不必亲自编写的,或者,如果没有大量的帮助和资源的话,就无法编写该代码,而您手头上并没有这些资源。诸如Apache之类的项目为利用他人完成的工作提供了方便--不必担心,他们还希望您使用他们的作品呢!在线文章和教程如果在IBMdeveloperWorks上发表文章,而又不提及Internet上的文章、教程、白皮书之类的大量参考资料,这无疑很愚蠢。网上有成百上千份教材,您也许可以发现近千篇关于Ajax的文章--在本系列中,我就已经发表了近十篇文章!这些文章大部分都有可用的代码、例子、下载以及其他各种类型的资源。如果您没有能力编写要使用的服务器端程序或脚本,或者找不到所需的开放源码程序或脚本,那么可以打开Google网站,试着输入对要找内容的基本描述。然后再在developerWorks网站上执行相同的操作。您常常可以发现所需的代码,甚至是整个脚本,并且还有一些有帮助的注释和关于其工作方式的描述。使用公共API很多时候,您会遇到非技术问题。您不需要帮助也能编写某个脚本或某段代码,然而,手头上却没有所需的数据或资源。在这些情况下,即使有了教程或者开放源码脚本,也还需要更多的东西。例如,考虑在Web页面上增加一个搜索引擎的情况。这样做的前提是您已经有了要搜索的数据--但是,如果要搜索您公司或组织以外的数据,那么该怎么办呢?回页首如果不是因为技术上的原因,而是因为数据而受到限制,那么,一个公共API也许可以帮助您解决问题。公共API允许使用其他人的服务器上的程序并使用其他人的数据。通常,API本身只定义如何与该程序交互。例如,通过一个用于Google搜索引擎的公共API可以发出搜索请求,但是实际上是由Google的代码搜索Google的数据,然后将结果返回给您的程序。您不仅可以利用他人在编写这些程序方面的技能,还可以利用远远超过您自己公司所能支持的数据。使用GoogleAjaxSearchAPI的准备工作毋庸置疑,Google仍然是在线时代极其重要的应用。上至老奶奶,下至四岁小孩,即使不理解网上的其它东西是怎么回事,也一定知道Google。Google运行着如此流行、如此有用的搜索引擎,并且致力于提供(几乎全部)免费的服务,所以毫不奇怪,它能提供可以在您自己的程序中使用的公共API。在本节中,您将完成使用GoogleAPI的准备工作,并清楚地了解如何与Google进行异步应用程序会话。从Google获取开发者密钥本文着重讨论Google的AjaxSearchAPI。通过访问GoogleAjaxSearchAPI主页(如图1所示),可以找到关于这个API的更多信息。(该主页的链接见参考资料。)图1.Google的AjaxSearchAPI页面回页首第一步是单击SignupforaGoogleAJAXSearchAPIkey链接。这时会进入另一个页面,在此页面上可以登记使用这个GoogleAPI。您需要接受所有使用条款(我认为所有条款都没有恶意)并提供您的应用程序所在Web站点的URL(如图2所示)。图2.登记使用Google的AjaxSearchAPI阅读完协议并勾选了复选框之后,输入URL,单击GenerateAPIKey,等待一二秒钟。此时必须登录Google,或者创建一个帐户。这是一个相当标准的过程,您应该可以自己完成。完成上述操作后,可以看到一个回复页面,其中给出了一个非常长的密钥,并确认您的URL,甚至还给出一个示例页面。这个密钥看上去类似于以下形式:ABQIAAAAjtuhyCXrSHOFSz7zK0f8phSA9fWLQO3TbB2M9BRePlYkXeAu8lHeUgfgRs0eIWUaXgGoogle的API文档应该使用什么URL?Google要求提供的URL大致就是站点所在的域。如果有自己的域,就像我一样,那么可以使用(当然,要用您自己的域替换我的域)。只有当站点使用一个子域,或者一个较大域中的某个特定路径时,才需要指定更详细的URL。在这种情况下,可能需要使用形如~bmclaugh或。但是,除了以上的特殊情况外,不要向Google提供过于详细的URL--只需提供用于访问整个Web站点的根URL,就可以在该URL内随处使用这个API。在开始使用获得的密钥之前,要花点时间阅读一下Google的API文档(在提供密钥的页面的底端有一个链接,本文的参考资料中也提供了该链接)。即使您通过本文有了很好的初步认识,仍然会发现Google的API文档是一个很好的参考资料,通过该文档可能会得到关于如何在您自己特有的应用程序中、站点上使用Google的一些有趣的想法。最简单的Google搜索Web应用程序为了看看实际效果,我们以Google提供的示例Web页面为例,对它稍做修改,然后看看它会变成什么样子。创建搜索框清单1显示了一个很简单的Web页面。将这段代码输入到您喜欢使用的编辑器中,保存为文件,然后将该文件上传到上个小节中提供给Google的域或URL上。清单1.一个简单的Google搜索应用程序的HTML代码htmlheadtitleMyGoogleAJAXSearchAPIApplication/titlelinkhref==text/cssrel=stylesheet/scriptsrc==uds.js&v=1.0&key=YOURKEYHEREtype=text/javascript/scriptscriptlanguage=Javascripttype=text/javascriptfunctionOnLoad(){//CreatetheGooglesearchcontrolvarsearchControl=newGSearchControl();//TheseallowyoutocustomizewhatappearsinthesearchresultsvarlocalSearch=newGlocalSearch();searchControl.addSearcher(localSearch);searchControl.addSearcher(newGwebSearch());searchControl.addSearcher(newGvideoSearch());searchControl.addSearcher(newGblogSearch());回页首//TellGoogleyourlocationtobasesearchesaroundlocalSearch.setCenterPoint(Dallas,TX);//DrawthecontrolontheHTMLformsearchControl.draw(document.getElementById(searchcontrol));}/script/headbodyonload=OnLoad()divid=searchcontrol//body/html注意使用从Google获得的密钥替换代码中的粗体文本。当装载该页面时,可以看到类似于图3的一个页面。图3.最简单的Google搜索窗体这个页面看上去很简单,但实际上那个小小的控件背后是Google的强大搜索能力。运行搜索输入一个搜索词并单击Search,使Google开始工作。很快可以看到一些搜索结果,如图4所示。图4.Google的搜索结果添加预搜索页面显然,执行一次搜索之后,页面看上去好多了。视频、博客和搜索结果使页面更加美观。因此,您可能想添加一个预搜索,即您定义的一个搜索词,当用户装载您的页面时,首先将看到该搜索词的搜索结果。为此,可以将清单2中以粗体显示的那行代码添加到JavaScript中。清单2.添加预搜索词functionOnLoad(){//CreatetheGooglesearchcontrolvarsearchControl=newGSearchControl();//TheseallowyoutocustomizewhatappearsinthesearchresultsvarlocalSearch=newGlocalSearch();searchControl.addSearcher(localSearch);searchControl.addSearcher(newGwebSearch());searchControl.addSearcher(newGvideoSearch());searchControl.addSearcher(newGblogSearch());//TellGoogleyourlocationtobasesearchesaroundlocalSearch.setCenterPoint(Dallas,TX);//DrawthecontrolontheHTMLformsearchControl.draw(document.getElementById(searchcontrol));searchControl.execute(ChristmasEve);}显然,您可以将自己的初始搜索词加入代码中,以定制页面装载时所显示的内容。JavaScript解析在继续学习之前,简单看一下这些基本命令的作用。首先,创建一个新的GSearchControl,如清单3所示。以下结构可用于执行所有搜索任务:清单3.创建新的GSearchControlfunctionOnLoad(){//CreatetheGooglesearchcontrolvarsearchControl=newGSearchControl();...}接着,代码使用GlocalSearch设置一个新的本地搜索;这是特殊的Google结构,通过它可以对特定位置执行搜索。这个本地搜索如清单4所示。清单4.设置新的本地搜索functionOnLoad(){//CreatetheGoogl