获取目录数据用 POST 不用 GET?

ValueError 发布于 2011/02/27 04:25
阅读 1K+
收藏 1

话说貌似 zTree 的开发团队亦在本站,所以弱弱问个问题。。。

事情是这样的,我用 zTree 做了一个目录树,很好用(把 PHP 递归生成树结构的过程转移到前端了,省下了不少服务器资源),先感谢一下开发团队:)

后来我把控制器改成了 Rest 风格的,会根据请求的 HTTP Method 定位 action,结果 zTree 就获取不到数据了。我看了下 zTree 的源码,发现 Ajax 加载部分用的是 POST,而我把 json 输出放在 action_get() 方法里面了。我没有修改控制器,而是直接把 zTree 的 ajax type 改成 GET 了,因为我觉得很奇怪,”获取数据“这种不对 Server 构成更改,而且是幂等的行为,不是应该分类到 GET 里面吗。

于是,弱弱的问下的那个问题就是:为什么要用 POST 获取数据呢?

加载中
0
whao601
whao601

没研究过REST的

但是用post 提交数据 可以避免乱码等问题吧

虽然语义上来说    从服务器获取数据用get,向服务器发送数据用POST

但是有的时候传递中文参数从服务器get数据时,要处理中文编码

0
ValueError
ValueError

引用来自#2楼“wanghao”的帖子

没研究过REST的

但是用post 提交数据 可以避免乱码等问题吧

虽然语义上来说    从服务器获取数据用get,向服务器发送数据用POST

但是有的时候传递中文参数从服务器get数据时,要处理中文编码

这里没有提交数据,是读取树的节点信息喔。

而且乱码与否和请求方法无关吧?编码是编码。

0
xyz555
xyz555

post和get没必要去纠结一定要用什么,除非是上传或是字符串长度限制问题用post,否则post和get那个方便顺手就用那个。post和get也不存在那个更安全的问题。

zTree的作者也就是以上这几方面考虑的吧。

0
ValueError
ValueError

引用来自#4楼“xyz555”的帖子

post和get没必要去纠结一定要用什么,除非是上传或是字符串长度限制问题用post,否则post和get那个方便顺手就用那个。post和get也不存在那个更安全的问题。

zTree的作者也就是以上这几方面考虑的吧。

关键问题是使用 REST 风格的 API 时候,POST 和 PUT、GET、DELETE 三者有根本区别,POST 不是幂等的,多次请求会重复操作。。。

不过这个和 Tree 没有神马关系,我只是很奇怪问下。。。另外被我改成了 GET 不知是否会影响到其他地方。

0
zTree
zTree

你好,还不是很清楚你的具体情况,对于url请求来说,post和get的最大区别就是:1、字符编码 2、参数长度的问题

对于这两个问题最好的控制解决方案当然是使用post了。 zTree之所以用POST,当然也就是为了更好的避免以上两个问题,而且我用异步加载的Demo测试了一下,如果把源码中的POST修改为GET,貌似没有什么问题,还望你再检查一下你的代码,是不是某些东西有冲突造成的??

0
ValueError
ValueError

引用来自#6楼“dyhunter”的帖子

你好,还不是很清楚你的具体情况,对于url请求来说,post和get的最大区别就是:1、字符编码 2、参数长度的问题

对于这两个问题最好的控制解决方案当然是使用post了。 zTree之所以用POST,当然也就是为了更好的避免以上两个问题,而且我用异步加载的Demo测试了一下,如果把源码中的POST修改为GET,貌似没有什么问题,还望你再检查一下你的代码,是不是某些东西有冲突造成的??

呵呵,不是冲突,而是控制器会根据HTTP请求的方法派发到 action_get()、action_post()、action_put()、action_delete() 上去,而树的数据获取是写在 action_get() 的,action_post() 里面只有添加节点的逻辑,所以当然获取不到数据了。

0
zTree
zTree

本人理解你的控制器是根据Http的内容决定选择哪个action的,那么可以这么考虑,即便是zTree使用POST,你同样可以利用传递的参数值也当做控制器里面的派发规则吧? 这样是不是就能解决你的问题?

另外,顺便说一句,asyncUrl参数本身也可以加上参数的,例如:http://www.domain.com/getNode.do?m=getNode

0
ValueError
ValueError

引用来自#8楼“dyhunter”的帖子

本人理解你的控制器是根据Http的内容决定选择哪个action的,那么可以这么考虑,即便是zTree使用POST,你同样可以利用传递的参数值也当做控制器里面的派发规则吧? 这样是不是就能解决你的问题?

另外,顺便说一句,asyncUrl参数本身也可以加上参数的,例如:http://www.domain.com/getNode.do?m=getNode

我不是 Java 应用,如果在我用的框架中,用这个方法又要修改路由规则($_GET 已经被 unset 了),不大好

其实也没什么,只是好奇问一下 :)

我很小的数据量,最多就不用 zTree 的异步加载,自己用 JQuery 取得 JSON 然后作为参数传给 zTree

0
该用户已被和谐
该用户已被和谐

GET可能会因为使用浏览器预加载功能造成很多不爽的事情。例如压力之类的...

0
陈杰
陈杰

1. get是从服务器上获取数据,post是向服务器传送数据。
2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
3. 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
4. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
5. get安全性非常低,post安全性较高。但是执行效率却比Post方法好。 

建议:
1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方式;
2、在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式;

返回顶部
顶部