书上举了个例子:
引用
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方法里,其余部分作为作用域信息。
我想知道这个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'
看起来还不错,挺像回事。
总结一下:ROA中所说的“资源”并不是指领域模型中的领域对象,我认为它应该是指互联网上基于http协议开放给客户端的一个接口。通俗点说就是:一个uri就确定了一个资源,你可以通过各种HTTP动词来操作这个资源。
我原来是死抠“资源”这么个词,一直以为一个“资源”一定要在route里对应一个map.resources,对每个资源的操作只能有CRUD,所以造成Controller数量暴增(想像一下,以前咱们的做法是定义一个Controller,然后在里边定义一堆action,现在——按照我这种错误的理解——action被限制了只能有7个,如果不能由某个资源的CRUD搞定的动作,应该属于另外一个资源。也就是一个资源对应了一个Controller,这样自然造成Controller数量暴增)。
在JE和Google翻资料一周左右,读完《RESTful Web Services》第1章,经过一个很小的项目实战,得出以上这些东西。如果有什么不对的地方欢迎大家指正。
补充:刚才在翻资料的时候发现一个博客里转载的一系列文章挺不错:
http://mypages.iteye.com/blog/293201一共五篇