您所在的位置: 首页>>读书频道>>设计开发>>其它开发>>

Programmable Web的分类

http://book.51cto.com  2008-05-12 15:53  [美]Leonard Richardson 、Sam Ruby/徐涵、李红军、..  电子工业出版社  我要评论(0)

第1章 Programmable Web及其分类

在编写计算机程序时,并非只能使用自己设计的算法,你还可以使用编程语言标准库里的算法;另外,也可以从相关图书或第三方库里找到更多的算法。除非在做非常前沿的东西,否则一般不必自己设计算法。

运气好的话,数据也能找到现成的。某些应用是完全由用户所提供数据驱动的。有时,获得数据是轻而易举的。比方说,假如要对垃圾邮件进行分析,你很容易获得所需数据:你可以下载一些公共数据集——单词表、地理数据、素数表、公共领域文本(public domain texts)等——它们就像第三方库一样供你使用。但是,假如你需要其他种类的数据,那就不是这么容易了。哪里有这些数据呢?它们越来越多地来自于programmable web(译注 )。

作为人类用户,当你要寻找有关某话题的图书时,多半会用浏览器打开一个在线图书馆或在线书店的URI,比方说http://www.amazon.com/

提示:“URL”是一个常被用来表达网址的术语。但在本书中,我将遵从HTTP标准,统一采用“URI”这一术语。因为每个作网址用的URI也是一个URL,所以你可以用“URL”来替换我说的“URI”,它们是一个意思。

你将收到服务器返回的一个网页,即一个HTML格式的文档,浏览器将把该HTML文档以图形化的方式展示在你面前。你会看到该网页里包含一个搜索表单(form),可以在其中输入要搜索的主题(比如“web services”),然后提交该表单。此时,浏览器将再次发出HTTP请求,这次请求的目标URI将提供你所寻找的主题的搜索结果。继续Amazon的例子,浏览器第二次请求的目标URI可能是这样一个URI:http://amazon.com/s? url=search-alias%3Dstripbooks&field-keywords=web+services。
位于amazon.com的Web服务器将返回另一个HTML格式的文档,其中包含对搜索结果的描述和指向其他搜索选项的链接等(见示例1-1)。同样地,浏览器将把该文档以图形化的方式展示在你面前,供你浏览,并决定下一个动作。

示例1-1:amazon.com返回的HTML文档(片断)

 ...
http://www.amazon.com/Restful-Web-Services-Leonard-Richardson/dp/...>
RESTful Web Services

by Leonard Richardson and Sam Ruby

(Paperback - May 1, 2007)

human web上充满大量的数据(data):图书信息、评价、价格、到货时间、消息、照片等(当然还有各种垃圾信息)。同时,它也充满大量的服务(services):搜索引擎、在线商铺、博客、wiki、计算器,还有游戏等。不需要把所有这些数据与程序都安装到你的本地计算机上;相反,只需安装一个程序——Web浏览器——就可以通过它来访问网上的数据与程序了。

programmable web也差不多,它跟human web的主要不同在于:programmable web返回的不是令人赏心悦目的HTML页面,而是冷漠刻板的XML文档。programmable web不是专门面向人类用户使用的,它的数据是准备作为“软件程序的输入”用的。

示例1-2是一段Ruby脚本,它用programmable web来完成一项传统的human web的任务:搜索所有匹配某个关键字的图书。它通过采用Ruby/Amazon库(http://www.caliban.org/ ruby/ruby-amazon.shtml)将访问Web的细节隐藏在编程语言接口之后。

示例1-2:一段用于搜索图书的Ruby脚本

 #!/usr/bin/ruby -w
# amazon-book-search.rb
require 'amazon/search'
if ARGV.size != 2
puts "Usage: #{$0} [Amazon Web Services AccessKey ID] [text to search for]"
exit
end
access_key, search_request = ARGV
req = Amazon::Search::Request.new(access_key)
# 对于搜索结果中的每一本书…
req.keyword_search(search_request, 'books', Amazon::Search::LIGHT) do |book|
# 打印出书名和作者
puts %{"#{book.product_name}" by #{book.authors.join(', ')}}
end
你需要注册一个Amazon Web Services账号(http://aws.amazon.com/),然后把上述Ruby代码里的Access Key ID改为你自己的Access Key ID,才能成功运行本程序。下面是一个运行本程序的例子:
$ ruby amazon-search.rb C1D4NQS41IMK2 "restful web services"
"RESTful Web Services" by Leonard Richardson, Sam Ruby
"Hacking with Ruby: Ruby and Rails for the Real World" by Mark Watson

理想情况下,programmable web在工作方式上跟human web是一致的。当amazon- book-search.rb调用 Amazon::Search::Request#keyword_search 方法时,Ruby程序的作用就好比一个Web浏览器:向http://xml.amazon.com/onca/xml3?KeywordSearch= restful+web+services&mode=books&f=xml&type=lite&page=1发出HTTP请求。位于xml. amazon.com的Web服务器将响应该请求:返回一个XML文档。这个返回的XML文档(如示例1-3所示)如同你在Web浏览器里看到的HTML文档,包含了对搜索结果的描述,只不过它比HTML文档更加结构化。

示例1-3:xml.amazon.com返回的XML文档(片断)

...
RESTful Web Services
Book

Leonard Richardson
Sam Ruby

01 May, 2007
...

对Web浏览器来说,它的职责只是发出HTTP请求,然后以一种人类可以理解的方式把服务器的响应呈现出来。它不必思考这个HTTP响应是什么意思——那是人类用户的事。而Web服务客户端就没这么轻松了:因为程序是事先编好的,所以它必须既像Web浏览器一样获取数据,还要像“人类用户”一样,判断这些数据是什么意思;Web服务客户端必须自动地从HTTP响应中提取含义,并根据含义决定下一个动作。

示例1-2所示的Web服务客户端先解析XML文档,提取一些相关信息(书名及作者),然后把这些信息在标准输出(standard output)上打印出来。实际上,amazon-book-search.rb这个程序就像一个专用的小型Web浏览器,把数据传递给人类用户。它也可以在无人工干预的情况下,容易地对Amazon的图书数据做一些其他操作,比如:把书名存入数据库,或者以作者信息来驱动一个推荐引擎(recommendation engine)等。
另外,数据并非只能由服务器传向客户端。正如你可以修改human web的某些部分(比如在你的博客上发布文章,或者购买一本书)一样,也可以编写程序来修改programmable
web。你可以把它当作一个存储空间,也可以把它当作一个算法源,具体要看你需要什么样的服务,以及是否有人提供这种服务。


示例1-4显示的是一个修改programmable web的Web服务客户端:Ruby的s3sh命令行解释器(command shell)(http://amazon.rubyforge.org/)。它是Amazon S3(Simple Storage Service)(http://aws.amazon.com/s3)的各种客户端中的一个。我会在第3章详细介绍S3的工作原理。如果你想学习使用s3sh的话,到时可以仔细研究。

你只要知道Amazon S3的作用是“在桶(一种带标签的容器)里存放对象(一种带标签的数据)”,就不难理解这个s3sh脚本了。s3sh程序在S3之上构建了一个交互式编程接口,而其他一些客户端则把S3用于备份或Web寄存。S3是一个非常灵活的服务。

示例1-4:用s3sh和S3处理programmable web

$ s3sh
>> Service.buckets.collect { |b| b.name }
=> ["example.com"]

>> my_bucket = Bucket.find("example.com")

>> contents = open("disk_file.txt").read
=> "This text is the contents of the file disk_file.txt"

>> S3Object.store("mydir/mydocument.txt", contents, my_bucket.name)

>> my_bucket['directory/document.txt'].value
=> "This text is the contents of the file disk_file.txt"

本章将对programmable web的现状作一个概述:它用到哪些技术,这些技术采用什么架构,以及哪些设计风格比较流行?我会展示一些实际代码及实际HTTP交互的例子,但本章的主要目的,是希望你将万维网(World Wide Web)看成一种把计算机程序彼此衔接起来的方式,就如同使彼此连系起来一样。

Programmable Web的分类

programmable web是基于HTTP和XML技术的。虽然HTML、JSON(JavaScript Object Notation)、纯文本或二进制文档也在使用,但是采用较多的还是XML。programmable web还是基于HTTP的:不采用HTTP,就不是基于Web的(注1)。除了这些仅有的共识,剩下的就差不多是争论了。没有固定的术语,而且同一术语(就像“REST”)各人有各人的用法,让人感到含糊和困惑。目前所需要的是一种对programmable web进行统一分类的方法,有了这样的分类,各个术语的含义就清晰化了。
把programmable web设想为一个生态系统,就像海洋一样,容纳着多种多样的奇异生物。旧时的科学家和水手们根据生物的外表来对它们进行分类,于是,鲸被归为鱼类。而现代的科学家们根据动物在生命进化树中的位置来对它们进行分类,所以鲸被放在了哺乳动物一类。对于programmable web上的服务,我们也有两种类似的分类方法:根据所采用的技术(比如URI、SOAP、XML-RPC等),或者根据背后的(underlying)架构与设计思想。(注1)

这两种对海洋生物的分类方法常常和谐相处,没必要通过DNA检测来确定金枪鱼是更像鲶科鱼,还是更像海葵。但是,假如你很想知道为什么鲸在水下不能呼吸的话,你就不能(根据外表)把它归为鱼类,而应(根据内在的构造)将它归为哺乳类(注2)。

就programmable web的分类来说,目前的术语,大部分是根据外表(即所采用的技术)来对服务进行分类的。虽然在大多数情况下没有问题,但它们存在概念上的缺陷,而且会导致“鲸是鱼”的错误。我将提出一种基于架构的分类,并说明如何根据背后的设计原则作技术选择。我会在书中不断提及这里给出的分类,但我主要关心的是那些programmable web里跟“REST”有一定联系的部分。

【责任编辑:夏书 TEL:(010)68476606】

回书目   上一节   下一节
企业级Web2.0 你准备好了么?
WebSphere 实现SOA的利器
Web安全云时代
企业Web安全威胁在线评估系统
Web 2.0基础知识大全
 
 验证码: (点击刷新验证码)   匿名发表
  • Visual C++ 完全自学宝典

  • 作者:强锋科技,朱洪波
  • Visual C++ 6.0是微软公司为程序人员提供的Visual Studio 6.0工具套件中的重要组成部分。本书由浅入深地介绍使用Visual C++ 6.0..
Copyright©2005-2008 51CTO.COM 版权所有