十一之前一直在做CouchDB的简单应用。本想着趁着国庆之前放出篇文章作为一个记录,可没成想,这一拖就拖出去了一个假期。趁着下午闲在,先写一部分出来,后面的部分留个尾巴,以后再写。

一、关于CouchDB:最近想做点相关开发

传言,CouchDB这几年很受GEEK们的喜爱。于是,算是跟风,我也打算看看这种NoSQL数据库。然后嘛,从网上copy来点段落,也算是个科普:

CouchDB的作者曾是lotus开发人员。与传统的关系型数据库不同,它号称自己是文档数据库。所谓文档数据库,并不是说它只能存储文本,事实上因为它是一种schemal-less的概念。用过关系型数据库的同学都知道,数据表里定义的每一个字段都定义为一种类型:无论是int,char,datetime。但CouchDB的字段只有三个:文档ID文档版本号内容。内容字段可以看到是一个text类型的文本,里面可以随意定义数据,而不用关注数据类型,但数据必须以json的形式表示并存放[插一句嘴:就是这个json格式,搞得我后来纠结了好一阵子]。例如一个表述用户的文档可以表示为:
[
    _id:1001,
    _rev:1-32443289,
    {‘name':’wentrue’, ‘location':’beijing’}
]

CouchDB的底层是erlang语言,以RESTful API的格式提供服务。CouchDB的主要特点在于易用性及并发性。对于易用性我是有着深刻体会。只要一搭好服务,你不但拥有了一个听任你调遣的数据服务端,还拥有一个简洁web server,如果你是在本地部署的,在浏览器上访问http://localhost:5984/_utils/,你就可以看到一个管理与查询的后台。在那个后台,你基本能实现用其它客户端能实现的所有事情。也就是说,即便你不懂编程语言,你可以在这个管理平台自由发挥。当然,如果你懂一些javascript,那你就可以把CouchDB玩转了。

简单介绍就到这里。如果有兴趣了解更多,点击原文,或者到CouchDB Wiki看看。至于我想做的开发呢,也很简单:利用Chrome插件做前端,抓取网页;然后用CouchDB储存;最后拿着自家改装的编辑器进行文本编辑(至于之后能用map-reduce做的邪恶事情,你以为我会那么轻易说出来么~)【话说,很像evernote吧~忍不住吐两句槽…要不是evernote没有ENML格式转换API,加上E-mail API一直不能用(都做出来E-mail parsing才发现API没法用…伤不起啊…),谁会想着自己动手做出个山寨似的单机版evernote呢…?

二、关于HTTP中的REST风格

CouchDB采用的是REST架构的API。那么,什么是REST架构呢?

表征状态转移(英文:Representational State Transfer,简称REST)是Roy Fielding 博士在2000年他的博士论文中提出来的一种软件架构 风格。目前在三种主流的Web服务 实现方案中,因为REST模式的Web服务 与复杂的SOAP 和XML-RPC 对比来讲明显的更加简洁,越来越多的web服务开始采用REST风格设计和实现。例如,Amazon 提供接近REST风格的Web服务进行图书查找;雅虎提供的Web服务也是REST风格的。

下面几条,是REST风格的要点:

  • 资源是由URI来指定。
  • 对资源的操作包括获取、修改、创建和删除资源,这些操作正好对应HTTP协议提供的GETPOSTPUTDELETE方法。
  • 通过操作资源的表现形式来操作资源。
  • 资源的表现形式则是XML或者HTML,取决于读者是机器还是人,是消费web服务的客户软件还是web浏览器。当然也可以是任何其他的格式。

从实际操作的角度来讲,RESTful Web API 对资源的操作包括获取、修改、创建和删除资源,这些操作正好对应HTTP协议提供的GET、POST、PUT和DELETE方法。

资源 GET PUT POST DELETE
一组资源的URI,比如http://exp.com/re/ 列出 URI,以及该资源组中每个资源的详细信息(后者可选)。 使用给定的一组资源替换当前整组资源。 在本组资源中创建/追加一个新的资源。 该操作往往返回新资源的URL。 删除整组资源。

三、调用CouchDB的API

如果想要调用CouchDB的API,用curl生成HTTP请求无疑是最合适的。不过,如果想在网页中完成这些事情,就需要不同的方法。下面呢,是几种看起来还不错的选择:
1、IronPython,一种在.NET平台下实现Python的东东。用Python来生成HTTP请求当然很方便。另外,CouchDB也有支持Python的库。不过,IronPython Browser在我的机子上跑不起来…PASS
2、使用CouchDB自带的js封装库:jquery.couch.js。好玩,但是不够给力,PASS
【实际上也是没跑起来…唉…
3、用JQuery,生成HTTP Request。下面两段代码是两种生成HTTP请求的不同方法。第一个是直接调用JQuery中的HTTP请求函数(JQuery中没有直接的PUT、DELETE方法…很不方便…但是GET和POST还是可以的~)
<br /> function get(){<br /> $.get('http://127.0.0.1:5984/albums');<br /> alert("end of query.");<br /> }<br />
至于PUT和DELETE嘛,可以动用JQuery中的AJAX方法封装HTTP请求
<br /> function ajax_put(){<br /> $.ajax({<br /> url: 'http://localhost:5984/albums',<br /> type: 'DELETE',<br /> method: 'DELETE',<br /> success: function( response ) {<br /> alert("success" + response);<br /> },<br /> error: function( response ) {<br /> alert("fail" + response);<br /> }<br /> });<br /> }<br /> alert("end of query.");
4、不使用JQuery封装HTTP请求(最后用的还是这个~)
@Chrome控制台命令输入演示(JavaScript代码类似,就不贴了):
var oHttp=new XMLHttpRequest();
oHttp.open(‘GET’,’http://localhost:5984′)
oHttp.send();

这样,就可以用发送出HTTP请求了~不过,这样只能在IE中调用API了,如果在Chrome里面呢,则会发生如下错误:
XMLHttpRequest cannot load http://localhost:5984/. Origin null is not allowed by Access-Control-Allow-Origin.
这种错误比较邪恶,属于跨域请求错误…这个问题下次再说。