论坛首页 Web前端技术论坛

给Ajax技术初学者的一些建议

浏览 65405 次
该帖已经被评为精华帖
作者 正文
   发表时间:2007-05-15  
to robbin,谢谢纠正。你说的那些含义我都看过了,大部分懂了,但是还需要自己更多的实践来理解REST风格的URL能够表达的范围。

to winterwolf,我是就除GET方式之外的其他方式来说的。

REST把HTTP协议应用得非常充分啊,不过貌似离不开ajax这样可以remote call的工具。
0 请登录后投票
   发表时间:2007-05-15  
winterwolf 写道
....
ajax 根据用户的交互 向post数据提交三个动作和相关参数
<post>
<acts>
<act>
<name>价格清单聚合</name>
<参数/〉
<act>
<act>
<name>xml->excel转换</name>
<act>
<act>
<name>mail服务</name>
<参数/〉
<act>
<acts>
</post>



你的设计有点意思,什么时候咱们专门开个主题深入讨论ajax服务接口的封装问题。
0 请登录后投票
   发表时间:2007-05-15  
robbin 写道
winterwolf 写道
sorphi 写道
>> PUT /columns/1/subcolumns/1

我可不可以理解成REST是URI表面的尽量简化(实际上面的URL中包含了两个服务端所需要的查找资源的参数,column =1 && subcolumn=1),但是在提交到服务端时,在header中可以随意准备服务端所需要的一切参数?


用header或body放参数当然可以 但是如果目的仅仅是要显示某条信息(单一资源) 这样做就不好了 即便google上有你的url别人也打不开。

因为他们不知道head或body中需要什么参数。缺少参数服务器不返回结果


这你就错了,搜索引擎只会去访问超文本连接,他不会尝试去触发页面的form提交。这也算是很多人对HTTP协议基础知识缺失。

GET代表对互联网资源的访问,但不改变资源的状态,对于同一个URL,无论重复发送多少次GET请求,都应该返回同样的数据。所以很多人在web项目编程中很不注意这一点,删除或者修改的link也用GET,这全部都是误用,也有某种程度的安全隐患。

POST/PUT/DELETE代表修改互联网资源的状态,参数一般不通过URL的querystring传递,而是通过请求的body。

所以搜索引擎只会去爬超文本连接,不会去触发页面POST。如果目的是显示信息,那么通过POST协议去提交,也是误用。


哈哈 误会啊。 我明白你的意思  不解释了
0 请登录后投票
   发表时间:2007-05-15  
leebai 写道
winterwolf 写道
....
ajax 根据用户的交互 向post数据提交三个动作和相关参数
<post>
<acts>
<act>
<name>价格清单聚合</name>
<参数/〉
<act>
<act>
<name>xml->excel转换</name>
<act>
<act>
<name>mail服务</name>
<参数/〉
<act>
<acts>
</post>



你的设计有点意思,什么时候咱们专门开个主题深入讨论ajax服务接口的封装问题。


好啊  从现在的情况看怎么封装都可以 关键是server端能否明白和执行。不过我看w3c和大厂商会出标准的 也许现在已经有了 只是我不知道
0 请登录后投票
   发表时间:2007-05-15  
sorphi 写道
>> PUT /columns/1/subcolumns/1

我可不可以理解成REST是URI表面的尽量简化(实际上面的URL中包含了两个服务端所需要的查找资源的参数,column =1 && subcolumn=1),但是在提交到服务端时,在header中可以随意准备服务端所需要的一切参数?



HTTP请求给服务器的信息可以来自:
1方法,方法就那么几个,当然如果服务器是我们自己设计的,方法也可以扩充;
2URI
3URL参数
4请求头标
5body

在我看来,对ajax应用来说,与其让服务器从各个部分读取上行信息,不如简化协议(没简化协议之前,简化地使用协议),只保留从body读取信息,这样的架构应该是最简洁和健壮的。曾经发现SAP的j2ee服务器有个bug,cookie值中含有非URL允许的字符时,不能正确读取---如果服务器按我说的方式架构,就不会有这种问题。
0 请登录后投票
   发表时间:2007-05-15  
robbin 写道
winterwolf 写道
sorphi 写道
>> PUT /columns/1/subcolumns/1

我可不可以理解成REST是URI表面的尽量简化(实际上面的URL中包含了两个服务端所需要的查找资源的参数,column =1 && subcolumn=1),但是在提交到服务端时,在header中可以随意准备服务端所需要的一切参数?


用header或body放参数当然可以 但是如果目的仅仅是要显示某条信息(单一资源) 这样做就不好了 即便google上有你的url别人也打不开。

因为他们不知道head或body中需要什么参数。缺少参数服务器不返回结果


.....

GET代表对互联网资源的访问,但不改变资源的状态,对于同一个URL,无论重复发送多少次GET请求,都应该返回同样的数据。.....



javaeye好象公然违背这一规则啊? 张三访问http://www.iteye.com/,返回“欢迎张三!”leebai访问http://www.iteye.com/,返回“欢迎leebai!”
0 请登录后投票
   发表时间:2007-05-15  
to leebai:
我免战。可以先告一段落了,等过一段时间干完活了再来与你缠斗。:D

注意:REST是一种架构风格,RPC是另外一种架构风格。为何HTTP要设计为现在这个样子,大家最好先看了论文再来争论。
有一点是肯定的,如果你想要充分利用HTTP底层的基础设施,例如HTTP缓存、HTTP认证,并且使得你们的Web应用具有最佳的可伸缩性,那么最好基于REST的架构来做设计。为何REST风格的架构能够满足这样的可伸缩性要求,请自行去阅读论文,在论文中有相当严密的理论和实践方面的证明。如果连论文都不肯阅读,我真的没有多大兴趣去陪一个不肯学习接受新知识新观念(当然REST本身并不新,只是对于某些不了解的同学而言)的人版聊。纠正某些人的误解或者在这里做REST和HTTP的科普并不是我的责任,还有更加有利可图的事情等着我。

Fielding是何许人也?他是NCSA之外的第一个Web接口库libwww-perl的开发者,还是Apache HTTP服务器的核心设计者,早期Apache内部的所有与协议有关的部分都是他设计开发的,所以你们可别以为他就是一个成天喝茶看报的老学究。

上面的两位同学,我先闪人了。有本事你们去可以著书立说完全推翻Fielding的理论。只要你能写出来,我可以保证你绝对能出版。
0 请登录后投票
   发表时间:2007-05-15  
引用
你再想想,在复杂资源中,PUT要处理的各种操作并非只是更改资源属性这么简单,比如上面我的例子:

1、修改子栏目put:除了涉及修改栏目属性,还要保存栏目相关附件文件,设置修改日志等等,这些工作其他put是不需要的;
2、发布子栏目put:除了涉及修改栏目属性,还要更新栏目内容缓存,更新栏目全文检索的索引等等,这些工作其他put是不需要的;
3、移动子栏目put:除了涉及修改栏目属性,还要检查目标父栏目是否允许移入等等,这些工作其他put是不需要的;
。。。。。。。

也就是说很多操作其实都不是简单的原子操作,而是复杂的事务操作,这是我一直强调的。

如果要在一个PUT的处理代码中完成所有这些操作,只能引入一个巨大的swith case来处理,而case的条件参数,你不叫action,也得叫command,不叫command,也得叫do。。。反正英语表达行为就那么几个词,你是逃不掉的,和struct一点都没关系。


如果非要在一次web请求过程中,同时处理多项资源的多个操作,确实无法简单的映射到四种基本操作上。我看了一下beast项目,没有找到需要同时处理多项资源的场景。当然,在复杂一点的项目当中,确实存在这种需求,以目前我所知道的情况来说,我不知道有什么很优雅的解决方案。

如果我碰到这种情况,会在标准的GET/POST/PUT/DELETE之外,自定义其他语义操作,在该语义映射的action方法中处理这个请求。在这个方面,RoR的支持是很强大的,可以在routes.rb里面随意定义扩展操作语义,然后自动生成相关的link helper和action映射。当然,你可以说,在这种情况下,4个基本操作不是完备的。

0 请登录后投票
   发表时间:2007-05-15  
又想了一下,错不在Fielding同志,错在把REST抬出来套在Ajax脑袋上的同志。

Fielding是在2000年总结的REST,那时候ajax只是少数像老夫这样的怀疑论者才使用的技术,当时主流Web开发技术是各种“服务器动态页面”,REST的很多提法都是针对各种不规范的“XSP”程序,比如关于URI的资源唯一性问题,对“服务器动态页面”类型的应用,确实比较重要;但对与ajax请求来说,反正URI用户是看不见的,搜索引擎也是看不见的,HTTP缓存机制基本也是用不上的,这种情况下,死缠URI的规范严瑾还有什么意义?

winterwolf应该理解我的意思。
0 请登录后投票
   发表时间:2007-05-15  
robbin 写道
hexiaodong 写道
如果要删除一个对象集合的话,用REST方式,uri怎么写?


DELETE  /orders




怪我没说清楚。我的意思不是删除所有某类资源,而是删除这类资源中的一部分。比如说总共1000个订单,用户想删除其中20个废单。我也想用rest,但我感觉rest风格下,代码似乎这样子:
DELETE /orders/1
DELETE /orders/2
DELETE /orders/3
...

用户似乎得操作20次,或者ajax执行20次。如果这样子的话,还是先不用的好。
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics