HTTP中Get与Post,PUT,DELETE的区别


HTTP中Get与Post,PUT,DELETE的区别

文章插图

Http定义了与服务器交互的不同方法 , 最基本的方法有4种 , 分别是GET , POST , PUT , DELETE 。URL全称是资源描述符 , 我们可以这样认为:一个URL地址 , 它用于描述一个网络上的资源 , 而HTTP中的GET , POST , PUT , DELETE就对应着对这个资源的查 , 改 , 增 , 删4个操作 。到这里 , 大家应该有个大概的了解了 , GET一般用于获取/查询资源信息 , 而POST一般用于更新资源信息 。
1.根据HTTP规范 , GET用于信息获取 , 而且应该是安全的和幂等的 。
(1).所谓安全的意味着该操作用于获取信息而非修改信息 。换句话说 , GET 请求一般不应产生副作用 。就是说 , 它仅仅是获取资源信息 , 就像数据库查询一样 , 不会修改 , 增加数据 , 不会影响资源的状态 。
* 注意:这里安全的含义仅仅是指是非修改信息 。
(2).幂等的意味着对同一URL的多个请求应该返回同样的结果 。这里我再解释一下幂等这个概念:
幂等(idempotent、idempotence)是一个数学或计算机学概念 , 常见于抽象代数中 。
幂等有一下几种定义:
对于单目运算 , 如果一个运算对于在范围内的所有的一个数多次进行该运算所得的结果和进行一次该运算所得的结果是一样的 , 那么我们就称该运算是幂等的 。比如绝对值运算就是一个例子 , 在实数集中 , 有abs(a)=abs(abs(a)) 。
对于双目运算 , 则要求当参与运算的两个值是等值的情况下 , 如果满足运算结果与参与运算的两个值相等 , 则称该运算幂等 , 如求两个数的最大值的函数 , 有在在实数集中幂等 , 即max(x,x) = x 。
看完上述解释后 , 应该可以理解GET幂等的含义了 。
但在实际应用中 , 以上2条规定并没有这么严格 。引用别人文章的例子:比如 , 新闻站点的头版不断更新 。虽然第二次请求会返回不同的一批新闻 , 该操作仍然被认为是安全的和幂等的 , 因为它总是返回当前的新闻 。从根本上说 , 如果目标是当用户打开一个链接时 , 他可以确信从自身的角度来看没有改变资源即可 。
2.根据HTTP规范 , POST表示可能修改变服务器上的资源的请求 。继续引用上面的例子:还是新闻以网站为例 , 读者对新闻发表自己的评论应该通过POST实现 , 因为在评论提交后站点的资源已经不同了 , 或者说资源被修改了 。
上面大概说了一下HTTP规范中GET和POST的一些原理性的问题 。但在实际的做的时候 , 很多人却没有按照HTTP规范去做 , 导致这个问题的原因有很多 , 比如说:
1.很多人贪方便 , 更新资源时用了GET , 因为用POST必须要到FORM(表单) , 这样会麻烦一点 。
2.对资源的增 , 删 , 改 , 查操作 , 其实都可以通过GET/POST完成 , 不需要用到PUT和DELETE 。
3.另外一个是 , 早期的Web MVC框架设计者们并没有有意识地将URL当作抽象的资源来看待和设计 , 所以导致一个比较严重的问题是传统的Web MVC框架基本上都只支持GET和POST两种HTTP方法 , 而不支持PUT和DELETE方法 。
* 简单解释一下MVC:MVC本来是存在于Desktop程序中的 , M是指数据模型 , V是指用户界面 , C则是控制器 。使用MVC的目的是将M和V的实现代码分离 , 从而使同一个程序可以使用不同的表现形式 。
以上3点典型地描述了老一套的风格(没有严格遵守HTTP规范) , 随着架构的发展 , 现在出现REST(Representational State Transfer) , 一套支持HTTP规范的新风格 , 这里不多说了 , 可以参考《RESTful Web Services》 。
说完原理性的问题 , 我们再从表面现像上面看看GET和POST的区别:
1.GET请求的数据会附在URL之后(就是把数据放置在HTTP协议头中) , 以?分割URL和传输数据 , 参数之间以&相连 , 如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0%E5%A5%BD 。如果数据是英文字母/数字 , 原样发送 , 如果是空格 , 转换为+ , 如果是中文/其他字符 , 则直接把字符串用BASE64加密 , 得出如:%E4%BD%A0%E5%A5%BD , 其中%XX中的XX为该符号以16进制表示的ASCII 。


推荐阅读