Chrome插件调用CouchDB的API(1) 【过完节啦~要开学啦~
十一之前一直在做CouchDB的简单应用。本想着趁着国庆之前放出篇文章作为一个记录,可没成想,这一拖就拖出去了一个假期。趁着下午闲在,先写一部分出来,后面的部分留个尾巴,以后再写。
一、关于CouchDB:最近想做点相关开发
传言,CouchDB这几年很受GEEK们的喜爱。于是,算是跟风,我也打算看看这种NoSQL数据库。然后嘛,从网上copy来点段落,也算是个科普:
[_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协议提供的GET、POST、PUT和DELETE方法。
- 通过操作资源的表现形式来操作资源。
- 资源的表现形式则是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.
这种错误比较邪恶,属于跨域请求错误…这个问题下次再说。