锁定老帖子 主题:求求你们,千万别再说自己是REST了
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2008-12-31
calmness 写道 引用 dlee说: Fielding的主要意思是说,客户端不应该事先了解服务器端URI的结构和针对每个URI的操作,而是应该通过某种发现机制来确定。 dlee说: 例如我使用浏览器访问一个网站,我先访问其首页,然后首页返回给我带有URI和link和form,指导我去访问其他页面。 dlee说: 这些link和form的URI、针对URI所执行的操作都是有可能变化的。 dlee说: 我如果不通过这种机制,事先在客户端代码中写死了,未来这些东西变了,客户端代码就会完全失效。 dlee说: 客户端不应该对服务器端的URI和针对URI所执行的操作做过多假设,那样客户端和服务器端的耦合就太紧了。 dlee说: 客户端应该通过服务器端返回给它带有超链接的表现来进行状态的迁移。 dlee说: hypertext不一定是html,也可以是带有超链接的其他格式。 Trustno1说: en,那么其他人在争论什么呢? dlee说: 他们争论这个理想国在实际的Web应用开发中是否有价值。 dlee说: 对于普通Web开发者来说,这样间接的方式是违反直观的。 Trustno1说: 违反直观?怎么说? dlee说: 比如你设计了一个Web服务的API,在文档里面告诉我可以使用/books/123/comments/55这种方式找到一本书的评论。 dlee说: 我在客户端代码中直接访问这个URI, dlee说: GET /books/123/comments/55 dlee说: 但是Fielding告诉你,你这样做是错误的,你不应该暴露出/books/123/comments/55。 dlee说: 你应该返回给客户端一个hypertext,里面含有这个URI。 dlee说: 然后客户端在服务器返回的这个hypertext的指导下访问这个URI。 dlee说: 但是客户端不应该事先假设服务器端一定会有这样一个URI。 非常非常有意思的说法,但是却让人很疑惑,难道说作为客户端,却要由服务器端来决定其操作? OK,假设成立,客户端等待服务器返回hypertext,然后客户端再根据返回的结果进行操作(混乱),等等,你服务器又怎么知道客户端要什么呢?客户端又如何告诉服务器其意图? Fielding博士训导出现在脑海中:“URI,都是通过URI”,O,明白了,那么这个URI从哪来?“hypertext指引”,那么这个"hypertext"指引又从哪来?“URI。。。。。。”,天,先有鸡还是先有蛋啊。。。。。。 对于客户端来说,无论如何,总是要通过一个URI描述其意图,这是无法改变的,为什么还要等服务器再返回一个指引,然后客户端再去根据指引请求?这样的话以后服务器有所变动,而客户端不需更改?真的如此? 既然总需要有一个URI,当我服务器通过URI了解客户端的意图时,再告诉客户端,你根据某某URI再做一个请求吧,就能达到你的目的了,good,我客户端就再请求一次。。。。。。 能给我解惑一下么?why? 你的疑惑restful web service这本书里就有答案。 |
|
返回顶楼 | |
发表时间:2009-01-05
jason_help 写道 calmness 写道 引用 dlee说: Fielding的主要意思是说,客户端不应该事先了解服务器端URI的结构和针对每个URI的操作,而是应该通过某种发现机制来确定。 dlee说: 例如我使用浏览器访问一个网站,我先访问其首页,然后首页返回给我带有URI和link和form,指导我去访问其他页面。 dlee说: 这些link和form的URI、针对URI所执行的操作都是有可能变化的。 dlee说: 我如果不通过这种机制,事先在客户端代码中写死了,未来这些东西变了,客户端代码就会完全失效。 dlee说: 客户端不应该对服务器端的URI和针对URI所执行的操作做过多假设,那样客户端和服务器端的耦合就太紧了。 dlee说: 客户端应该通过服务器端返回给它带有超链接的表现来进行状态的迁移。 dlee说: hypertext不一定是html,也可以是带有超链接的其他格式。 Trustno1说: en,那么其他人在争论什么呢? dlee说: 他们争论这个理想国在实际的Web应用开发中是否有价值。 dlee说: 对于普通Web开发者来说,这样间接的方式是违反直观的。 Trustno1说: 违反直观?怎么说? dlee说: 比如你设计了一个Web服务的API,在文档里面告诉我可以使用/books/123/comments/55这种方式找到一本书的评论。 dlee说: 我在客户端代码中直接访问这个URI, dlee说: GET /books/123/comments/55 dlee说: 但是Fielding告诉你,你这样做是错误的,你不应该暴露出/books/123/comments/55。 dlee说: 你应该返回给客户端一个hypertext,里面含有这个URI。 dlee说: 然后客户端在服务器返回的这个hypertext的指导下访问这个URI。 dlee说: 但是客户端不应该事先假设服务器端一定会有这样一个URI。 非常非常有意思的说法,但是却让人很疑惑,难道说作为客户端,却要由服务器端来决定其操作? OK,假设成立,客户端等待服务器返回hypertext,然后客户端再根据返回的结果进行操作(混乱),等等,你服务器又怎么知道客户端要什么呢?客户端又如何告诉服务器其意图? Fielding博士训导出现在脑海中:“URI,都是通过URI”,O,明白了,那么这个URI从哪来?“hypertext指引”,那么这个"hypertext"指引又从哪来?“URI。。。。。。”,天,先有鸡还是先有蛋啊。。。。。。 对于客户端来说,无论如何,总是要通过一个URI描述其意图,这是无法改变的,为什么还要等服务器再返回一个指引,然后客户端再去根据指引请求?这样的话以后服务器有所变动,而客户端不需更改?真的如此? 既然总需要有一个URI,当我服务器通过URI了解客户端的意图时,再告诉客户端,你根据某某URI再做一个请求吧,就能达到你的目的了,good,我客户端就再请求一次。。。。。。 能给我解惑一下么?why? 简单的说,其实用程序就是模拟你上网站的操作。Fielding博士说了,首先会有个起始的标志,就是一个起始的URI,然后根据这个URI获取hypertext,这个hypertext就像是网站的首页,这个hypertext(如:首页)就决定了你客户端(用户)的操作,你根据这个hypertext中的URI发送一个请求,又会获取一个hypertext(进入了网站的另一个页面),这个hypertext又决定了你客户端(用户)的操作,然后再请求,再获取hypertext。。。。。。 其实整个过程的难点就是怎么用程序去理解这个hypertext,个人感觉这一块Fielding博士就是在讲要用语义。 整个过程我不关心,我只想知道,服务器如何得到我的需求? 引用 dlee说: 比如你设计了一个Web服务的API,在文档里面告诉我可以使用/books/123/comments/55这种方式找到一本书的评论。 dlee说: 我在客户端代码中直接访问这个URI, dlee说: GET /books/123/comments/55 dlee说: 但是Fielding告诉你,你这样做是错误的,你不应该暴露出/books/123/comments/55。 dlee说: 你应该返回给客户端一个hypertext,里面含有这个URI。 dlee说: 然后客户端在服务器返回的这个hypertext的指导下访问这个URI。 dlee说: 但是客户端不应该事先假设服务器端一定会有这样一个URI。 我觉得太绕了,我再假设,hypertext本身就是一个资源呢?那又如何处理? 中间这层hypertext的意义在哪?多了一层抽象就真的有意义?而且是基于web的应用,那就是意味着,为此我将进行更多http请求,会不会太过了?过度设计也就源于此。我们都想就一个接口搞定所有的事情,然而事实上这可能么? |
|
返回顶楼 | |
发表时间:2009-01-06
jason_help 写道 简单的说,其实用程序就是模拟你上网站的操作。Fielding博士说了,首先会有个起始的标志,就是一个起始的URI,然后根据这个URI获取hypertext,这个hypertext就像是网站的首页,这个hypertext(如:首页)就决定了你客户端(用户)的操作,你根据这个hypertext中的URI发送一个请求,又会获取一个hypertext(进入了网站的另一个页面),这个hypertext又决定了你客户端(用户)的操作,然后再请求,再获取hypertext。。。。。。 其实整个过程的难点就是怎么用程序去理解这个hypertext,个人感觉这一块Fielding博士就是在讲要用语义。 你描述的这个程序看上去就是个网络蜘蛛啊。这么说来,REST 不过就是普通网站 + 浏览器客户端 + 网络蜘蛛。 |
|
返回顶楼 | |
发表时间:2009-01-07
最后修改:2009-01-07
andot 写道 jason_help 写道 简单的说,其实用程序就是模拟你上网站的操作。Fielding博士说了,首先会有个起始的标志,就是一个起始的URI,然后根据这个URI获取hypertext,这个hypertext就像是网站的首页,这个hypertext(如:首页)就决定了你客户端(用户)的操作,你根据这个hypertext中的URI发送一个请求,又会获取一个hypertext(进入了网站的另一个页面),这个hypertext又决定了你客户端(用户)的操作,然后再请求,再获取hypertext。。。。。。 其实整个过程的难点就是怎么用程序去理解这个hypertext,个人感觉这一块Fielding博士就是在讲要用语义。 你描述的这个程序看上去就是个网络蜘蛛啊。这么说来,REST 不过就是普通网站 + 浏览器客户端 + 网络蜘蛛。 按照我的判断,语义网(Semantic Web)最初确实就是为了简化搜索引擎/网络蜘蛛这样一大类Web应用的实现而设计的。 假设某人开发了一个专用的搜索引擎来搜索JavaEye的文章,这个搜索引擎需要依赖JavaEye目前对外暴露出的URI结构。有一天JavaEye改变了自己的URI结构,这个搜索引擎就立刻失效了。JavaEye的URI结构是否会改变完全不在这个人的控制范围中,这个决策完全由JavaEye的站长robbin说了算。所以依赖JavaEye的URI结构来开发这个搜索引擎,这样做是一件很愚蠢的事情。 URI的结构并不代表任何语义,语义是包含在hypertext所对应的media type设计中。在目前阶段,通过microformat为HTML添加语义是一种最现实的做法。 Fielding与Berners-Lee完全站在一个阵营里面,他们不会发表与对方相抵触的观点。REST与Semantic Web就是相互支持的。 关于这个事件,在InfoQ上也有专门的报道: http://www.infoq.com/cn/news/2008/12/restapi-must-be-hypertext-driven 希望大家通过参与这些讨论,擦亮眼睛,自己来识别出究竟什么才是真正的REST。在我看来,尤其是Java社区的一些人(往往顶着“专家”的头衔)对于REST的理解是非常片面和可疑的。这些人就像老毛利用鲁迅一样,从狭隘的实用主义出发,REST对于他们来说仅仅是达到某种目的的工具而已。很抱歉,这些人的行为让我不得不想到了“阴谋论”。 |
|
返回顶楼 | |
发表时间:2009-01-07
怎么方便怎么玩
|
|
返回顶楼 | |
发表时间:2009-01-07
dlee 写道 希望大家通过参与这些讨论,擦亮眼睛,自己来识别出究竟什么才是真正的REST。在我看来,尤其是Java社区的一些人(往往顶着“专家”的头衔)对于REST的理解是非常片面和可疑的。这些人就像老毛利用鲁迅一样,从狭隘的实用主义出发,REST对于他们来说仅仅是达到某种目的的工具而已。很抱歉,这些人的行为让我不得不想到了“阴谋论”。 所以,一年前我就在你的 BLOG 上提醒过你,REST 早晚会被狭隘的实用主义者利用,不管懂还是不懂都会拿去炒作,最终把 REST 搞臭。现在 REST 臭的连 Fielding 老先生都不高兴了吧。我想你在 Fielding 老先生不高兴之前对 REST 的理解跟现在的理解也大相径庭了吧。 所以,我从来不做跟 REST 沾边的东西,免得被人说成是利用 REST 的“阴谋论”者。呵呵。 |
|
返回顶楼 | |
发表时间:2009-01-07
最后修改:2009-01-07
andot 写道 所以,一年前我就在你的 BLOG 上提醒过你,REST 早晚会被狭隘的实用主义者利用,不管懂还是不懂都会拿去炒作,最终把 REST 搞臭。现在 REST 臭的连 Fielding 老先生都不高兴了吧。我想你在 Fielding 老先生不高兴之前对 REST 的理解跟现在的理解也大相径庭了吧。
所以,我从来不做跟 REST 沾边的东西,免得被人说成是利用 REST 的“阴谋论”者。呵呵。 是那位PHPRPC的作者吧,怪不得对REST这么讨厌呢。 确实,我以前对REST的理解和Fielding对REST的理解也是有很大差别的。Fielding自己也承认在他的博士论文中对hypertext驱动和media type设计并没有着重强调,这也算是他的一个失误了。 不过即使没有采用REST,也没有必要摆出一副事后诸葛亮的姿态洋洋得意。其实REST并没有那么可恶,即使采用的不是Fielding所说的那种纯粹的REST,采用部分的REST,已经可以得到很多好处了。例如,Rails中的REST Controller在简化编程模型方面的作用是巨大的。如果你不用Rails,可能没有什么感觉。 http://www.intertwingly.net/blog/2008/10/21/Progressive-Disclosure 《RESTful Web Services》的作者Sam Ruby这样说: Sam 写道 Without intending to take anything away from Roy’s (valid) criticism on labeling, REST isn’t an all or nothing proposition. One can get significant value from partial adoption.
我和Sam的观点完全相同。对于是否采用REST,我的观点是一贯的。那就是如果能接受REST,应该“不争论,多实践”;如果完全无法接受REST,那就还按照原先的RPC方式来做好了。REST其实从来都不是什么必须要遵守的清规戒律,用不用REST,和采用其他架构风格一样,都是一种权衡。 |
|
返回顶楼 | |
发表时间:2009-01-07
最后修改:2009-01-07
我我从一开始也没有觉得 REST 可恶,我只是认为 REST 有它自己的适用范围,适合用 REST 的地方就用 REST,适合用 RPC 的地方用 RPC,才是正道。超出这个范围的宣传和炒作,试图用 REST 取代一切的人(比如要用REST取代RPC的人最后不过只是用URL包装了RPC而已)才是可恶的,Fielding 老先生不高兴的地方不也是这一点吗?
另外,不要总是喜欢乱给别人扣帽子,我一年前预言到今天的结果,怎么能算是“事后诸葛亮”呢?“事后诸葛亮”是事情发生后才能想到!比如: dlee 写道 Fielding自己也承认在他的博士论文中对hypertext驱动和media type设计并没有着重强调,这也算是他的一个失误了。
这个才叫“事后诸葛亮”。 |
|
返回顶楼 | |
发表时间:2009-01-08
dlee 写道 冉翔 写道 REST已经过去了,现在流行滴是:社会化
俺们做滴是社会化滴XXX网站…… REST过去了,HTTP也过去了,HTML也过去了,Web也过去了。 Really? 兄弟,说话要慎重些,免得被人笑。 真是一点幽默感都米有 |
|
返回顶楼 | |
发表时间:2009-01-08
最后修改:2009-01-09
看完本帖,我把InfoQ上所有的REST新闻都再看了一遍(当然偶懒,只看中文的——大约70篇),套用周星星的话:我对这些事物有了完全不同的看法。。。
|
|
返回顶楼 | |