锁定老帖子 主题:关于REST的一点想法,欢迎大家讨论。
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2007-04-14
REST之乱谈: 目前web上支持REST风格的应用还是比较少,当REST风格的应用多起来之后,REST的优势才会明显的显现出来,比如我想要一个OpenID登录认证,一个web方式的word,一个留言版,一个相册,一个投票器。。。不用自己做,只需使用提供相应REST接口的应用就可以了,那时整个web就是一个巨大的组件库,而REST使得使用、开发这些组件变成很容易 对于某个应用来说,REST的优势并不明显,REST可以减少controller中的方法(action)数,几个action也许会共用一个REST资源,各个action对于同一资源的表现也许会不一样。 当要开发一系列web应用,而这些应用之间要交换数据,互相调用的时候,REST才会显出威力来。 深夜,脑子昏沉的情况下完成次回帖,仅发表一下看法,也许有很多想错、写错了,还请见谅。 |
|
返回顶楼 | |
发表时间:2007-04-14
面向对象的时代前,大家说使用对象,以后软件就像搭积木,面向组件的时代,软件就用组件来搭建,后来,软件用Web服务搭建,后来,用REST。
实际上,谁都不行,软件也从来都不是搭积木。 myaniu 写道: 目前web上支持REST风格的应用还是比较少,当REST风格的应用多起来之后,REST的优势才会明显的显现出来,比如我想要一个OpenID登录认证,一个web方式的word,一个留言版,一个相册,一个投票器。。。不用自己做,只需使用提供相应REST接口的应用就可以了,那时整个web就是一个巨大的组件库,而REST使得使用、开发这些组件变成很容易 |
|
返回顶楼 | |
发表时间:2007-04-15
IMO, REST is about styles of ARCHITECTURE & constraints on ELEMENTS, it benefits the so called Modern Web as a whole, not any single webapp.
A single webapp is NOT a ``Network-based Software'', the Modern Web is. |
|
返回顶楼 | |
发表时间:2007-04-15
weiqingfei 写道 winterwolf 写道 weiqingfei 写道 大家能不能讨论以下rest的安全性问题。
如果rest想用ajax直接来调用web service安全性肯定有问题. ws不是单一的服务器端调用 往往需要将一个ws的输出加工发向第2个ws进行处理, 如此如此. 将所有ws需要的密码都传到客户端是可怕的. 在性能上ajax也会出问题 js用到现在已经超复合了 越来越难维护. rest只是一种理论 完全按理论来肯定不行. 我想有一个办法能解决所有的问题 那就是添加一个中间层次 ajax->ws 变为 ajax->中间层->ws 中间层将数据加工认证后发给ws 同时为ajax提供view减轻ajax端的负担. 就REST本身来讲,脱离了ajax,就没有了什么意义,因为浏览器本身是不支持put delete的, 如果只谈它的理论的话,我想这个早就在做了,比如url的重定向,可以实现面向资源的操作。 ajax不可能一直保留着用户名密码传来传去,应该还是用cookie的方式保持sessionid,但是这样又违背了”服务器无状态“这句话。 我想安全性问题还是在应用REST时比较头痛的问题。 中间层也就是现在传统的webapp 通过它来调用web service然后加工成小片的view 提供给ajax. 好处有以下几点 1 ajax始终访问自己的安全域不会出现跨域的问题. 2 用户名可以保存在cookie或者session中. 3 用户和WS端根本不传递密码 WS和中间层的密码和权限对用户是完全不透明的 4 server端无须准备一整页的view来刷新 仅仅需要加工一小部分 比如<div id="xxx"/>中的ui元素提供给ajax. 从而减轻了server端的负载. 也符合rest的原理 5 ajax的代码减少了. 只用xmlhttp即可 复杂的ajax库就不需要了. 如果浏览器支持xform xul svg xmlhttp这类标准ajax的负担就更少了. 甚至少到ajax消失并变为新的js功能 6 WS和中间层间完全是无状态的 和rest打平. 由于中间层是server端 ws也是server端 无疑它们之间可以完成比rest更丰富的WS功能和结构. |
|
返回顶楼 | |
发表时间:2007-04-17
winterwolf 写道 weiqingfei 写道 winterwolf 写道 weiqingfei 写道 大家能不能讨论以下rest的安全性问题。
如果rest想用ajax直接来调用web service安全性肯定有问题. ws不是单一的服务器端调用 往往需要将一个ws的输出加工发向第2个ws进行处理, 如此如此. 将所有ws需要的密码都传到客户端是可怕的. 在性能上ajax也会出问题 js用到现在已经超复合了 越来越难维护. rest只是一种理论 完全按理论来肯定不行. 我想有一个办法能解决所有的问题 那就是添加一个中间层次 ajax->ws 变为 ajax->中间层->ws 中间层将数据加工认证后发给ws 同时为ajax提供view减轻ajax端的负担. 就REST本身来讲,脱离了ajax,就没有了什么意义,因为浏览器本身是不支持put delete的, 如果只谈它的理论的话,我想这个早就在做了,比如url的重定向,可以实现面向资源的操作。 ajax不可能一直保留着用户名密码传来传去,应该还是用cookie的方式保持sessionid,但是这样又违背了”服务器无状态“这句话。 我想安全性问题还是在应用REST时比较头痛的问题。 中间层也就是现在传统的webapp 通过它来调用web service然后加工成小片的view 提供给ajax. 好处有以下几点 1 ajax始终访问自己的安全域不会出现跨域的问题. 2 用户名可以保存在cookie或者session中. 3 用户和WS端根本不传递密码 WS和中间层的密码和权限对用户是完全不透明的 4 server端无须准备一整页的view来刷新 仅仅需要加工一小部分 比如<div id="xxx"/>中的ui元素提供给ajax. 从而减轻了server端的负载. 也符合rest的原理 5 ajax的代码减少了. 只用xmlhttp即可 复杂的ajax库就不需要了. 如果浏览器支持xform xul svg xmlhttp这类标准ajax的负担就更少了. 甚至少到ajax消失并变为新的js功能 6 WS和中间层间完全是无状态的 和rest打平. 由于中间层是server端 ws也是server端 无疑它们之间可以完成比rest更丰富的WS功能和结构. 奇怪,为什么要加个中间层呢,你这儿的ws指的是什么ws?传统的么? 你的rest表现在什么地方?ajax——》中间层,还是中间层-》ws? 传统的ws架构本来就是这个样子的,客户端-》服务器端-》ws,只不过客户端和服务器端传的是http,服务器端到ws传的是soap。 在我看来rest本来就是为了简化系统,而不是把系统搞复杂,用普通的bs架构就可以很好的应用rest,只不过客户端必须应用ajax来发送get,post,put,delete以及accept内容形式。 传输方面使用json的话,就使得各个方面都是轻量级的了。 |
|
返回顶楼 | |
发表时间:2007-04-17
我们目前的项目,是采用OpenID的认证方式。对于没有OpenID的用户,可以在我们自己的服务器上新建一个OpenID。
感觉REST主要针对的还是API。使用客户端,对于API的调用绝对可以做到真正的无状态。当然,每次调用都要传输密码。 |
|
返回顶楼 | |
发表时间:2007-04-17
我本身不了解rest。不过单单看这个帖子的表达,似乎觉得有点不对味。
先叙述一下我对这个文章的理解: 1。rest就是主语+谓语,主语就是resource,谓语就是动作 2。就象01是和机器说话的语言,obj.doSomething()是和javac说话的语言一样,resource/operation就是和web说话的语言。 3。在rest语言中,只有resource/operation,没有参数。 如果是这样,感觉上相当优美。只是,我的经验让我总不由自主地把resource/operation和obj.message()等同起来。两者间概念上是否相同呢?是否可以说rest语言就是一个dynamically typed的OO语言?是一个每个message都没有参数的语言? 可是,这样真的够用了么?一个纯粹的树形结构组织出来的语言真的足够表达我们在web上要做的所有事情么? 不错,我可以把tom.talkTo(Jack)变成session/tom/jack/talk,把add(a,b)变成addition/a/b/apply,不过这样做似乎有点自己做人肉编译器的感觉。:-) 别的我不知道,但是要我用ruby或者java设计一个库,但是不许给任何方法带参数,我只怕做不到阿。 |
|
返回顶楼 | |
发表时间:2007-04-17
ajoo 写道 我本身不了解rest。不过单单看这个帖子的表达,似乎觉得有点不对味。
先叙述一下我对这个文章的理解: 1。rest就是主语+谓语,主语就是resource,谓语就是动作 2。就象01是和机器说话的语言,obj.doSomething()是和javac说话的语言一样,resource/operation就是和web说话的语言。 3。在rest语言中,只有resource/operation,没有参数。 如果是这样,感觉上相当优美。只是,我的经验让我总不由自主地把resource/operation和obj.message()等同起来。两者间概念上是否相同呢?是否可以说rest语言就是一个dynamically typed的OO语言?是一个每个message都没有参数的语言? 可是,这样真的够用了么?一个纯粹的树形结构组织出来的语言真的足够表达我们在web上要做的所有事情么? 不错,我可以把tom.talkTo(Jack)变成session/tom/jack/talk,把add(a,b)变成addition/a/b/apply,不过这样做似乎有点自己做人肉编译器的感觉。:-) 别的我不知道,但是要我用ruby或者java设计一个库,但是不许给任何方法带参数,我只怕做不到阿。 REST和OO是不能够等同的。REST把唯一确定的URL作为资源,把针对URL不同访问方法(GET/POST,以及附加的其他参数)作为针对资源施加的操作。这个模型不OO,而且比OO要简单的多。 如果REST允许对资源的操作带有额外的参数,就意味着对同一个资源施加的一个操作不能够唯一确定资源的状态,那么就无法做到服务器端的无状态,从而各种对服务器端的前端缓存操作就无法实现了。 |
|
返回顶楼 | |
发表时间:2007-04-17
这个讨论到后面已经走题了,也许每个人对REST的理解都不同。
从rails框架对REST的支持角度来看,那么只要看一看beast项目的源代码,就可以很清楚的看出来rails对REST的理解。REST对于rails来说,毫无疑问减少了action的数量,看看beast的controllers,除了7个CRUD操作,自定义的额外的public的action很少。 对于rails框架来说,通过在POST协议之上附加额外的request参数,用来模拟PUT/DELETE,甚至各种其他自定义的操作,因此从这个角度来说,REST和AJAX没什么关系。从本质上来说,REST是简化互联网应用,提高互联网应用本身的伸缩性的,非要把AJAX扯进来,搞什么多层次结构转换,根本就是南辕北辙。 既然是ruby版的讨论,我就建议大家看看beast,Rick写的,rails框架作者之一,算是官方的rails REST demo了。 |
|
返回顶楼 | |
发表时间:2007-04-17
robbin 写道 这个讨论到后面已经走题了,也许每个人对REST的理解都不同。
从rails框架对REST的支持角度来看,那么只要看一看beast项目的源代码,就可以很清楚的看出来rails对REST的理解。REST对于rails来说,毫无疑问减少了action的数量,看看beast的controllers,除了7个CRUD操作,自定义的额外的public的action很少。 对于rails框架来说,通过在POST协议之上附加额外的request参数,用来模拟PUT/DELETE,甚至各种其他自定义的操作,因此从这个角度来说,REST和AJAX没什么关系。从本质上来说,REST是简化互联网应用,提高互联网应用本身的伸缩性的,非要把AJAX扯进来,搞什么多层次结构转换,根本就是南辕北辙。 既然是ruby版的讨论,我就建议大家看看beast,Rick写的,rails框架作者之一,算是官方的rails REST demo了。 这个和在url后面跟加参数没有什么区别,说实话如果不是把操作放在请求头里,我看不出提出rest的意义,.net web里都是使用post协议,用隐藏域来定义操作的。 |
|
返回顶楼 | |