REST笔记

书上举了个例子:[quote]http://www.flickr.com/services/rest?api_key=xxx&method=flickr.photos.search&tags=penguin
尽管URI里包含“rest”字样,但它显然是一个采用HTTP信封的RPC式服务。另一方面,它的作用域信息(“具有‘penguin’标签的照片”)是放在URI里的——从这一点看,它跟REST式面向资源的服务有点像;不过它的方法信息(“搜索照片”)也被放在URI里了,而前面说过,对于REST式服务,方法信息应该放在HTTP方法里,其余部分作为作用域信息。[/quote]
我想知道这个URI写成RESTful的将会是个什么样。如果一个资源只有通过几个标准HTTP方法来操作,那么对这个photos也只能进行CRUD操作,如何搜索tags为penguin的photos?
我自己认为比较RESTful的URL应该是这样:http://www.flickr.com/photos/tags/penguin
可这样一来,在rails中如何跟PhotosController的action对上?添加一个名为tags的action吗?那岂不是又像文中说的:它的方法信息也被放在URI里了?

===========翻了些帖子、书本,大概1、2小时后============
好吧,我把tags为penguin的集合当作另一个资源吧。我在rails中试了一把,发现不知道该怎么配这个路由:/photos/tags/penguin
这么写吧:
map.resources :photos, :collection => {:tags => :get}

但是它只认识/photos/tags,不认识/photos/tag/penguin
参考了一下JavaEye,JE是这么干的:/favorite?tags=xxxx
那我是不是该写成:/photos?tags=penguin?
可是/photos这个url的get动作默认调用了PhotosController的index方法,该怎么调用我的name方法呢?

============继续思考,晚饭吃完后============
还有,按照我前面的理解:把tags为penguin的集合当作另一个资源,那这个url:/photos?tags=penguin是有问题的——这个url表示的是一个photos资源,而不是tags为penguin的photos资源,因为它的uri是/photos而不是/photos/tags/penguin,一个资源是由uri而不是url确定的。

嗯,看来/photos/tags/penguin是正确的,我配了个路由如下:
map.connect ':controller/tags/:tag', :action => 'find_by_tag'


看起来还不错,挺像回事。 :)

[b]总结一下:ROA中所说的“资源”并不是指领域模型中的领域对象,我认为它应该是指互联网上基于http协议开放给客户端的一个接口。通俗点说就是:一个uri就确定了一个资源,你可以通过各种HTTP动词来操作这个资源。[/b]

我原来是死抠“资源”这么个词,一直以为一个“资源”一定要在route里对应一个map.resources,对每个资源的操作只能有CRUD,所以造成Controller数量暴增(想像一下,以前咱们的做法是定义一个Controller,然后在里边定义一堆action,现在——按照我这种错误的理解——action被限制了只能有7个,如果不能由某个资源的CRUD搞定的动作,应该属于另外一个资源。也就是一个资源对应了一个Controller,这样自然造成Controller数量暴增)。

在JE和Google翻资料一周左右,读完《RESTful Web Services》第1章,经过一个很小的项目实战,得出以上这些东西。如果有什么不对的地方欢迎大家指正。

补充:刚才在翻资料的时候发现一个博客里转载的一系列文章挺不错:[url]http://mypages.iteye.com/blog/293201[/url]一共五篇
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值