get和post的区别

摘要:get和post,我们在平时项目中经常用到,有时我们会被问到get和post有什么区别,一开始被问到的时候会挺懵逼的,除了字面理解之外,好像也不是很了解到底是什么区别?下面我来说说我对get和post的区别的理解~

以前我师兄问过我这么一个问题

  • Q : get和post有什么区别?
  • A :一个是用于取数据,一个是用于修改数据
  • Q : 还有吗?
  • A : 好像就这么多。。

然而我的回答他好像不是很满意,那时候确实是我对get和post的理解还不够,之后做了整理,才发现原来这才是答案~

HTTP与服务器交互的方法有4种:get、post、put、delete,这4种方法其实就对应了对资源的查、改、增、删这4个操作。不过平时我们用的话都是用get和post方法,用这两个方法就能完成所有的操作啦。

那get和post到底有什么区别呢?这个问题很多同学在面试的时候都会被问到,也是一个十分经典的问题,这里我来说说我自己对get和post的区别的看法~

1.原理区别

get是用于获取数据
这里的获取数据对应我们前面说到的对资源的查找操作,这个操作是安全而且幂等的,这里的安全是指这里是用于获取信息而不是修改信息,不会产生其他影响,而幂等则表现为对同个URL的多个请求都返回同样的结果。

post表示可能修改服务器资源

HTTP包结构

这里我们先来看一下HTTP包结构

HTTP请求:

1
<request line>    // 请求行:请求类型、要访问的资源以及HTTP版本
<headers>    // 请求头:说明服务器要使用的附加信息
<blank line>    // 空行
<request-body>    //请求体:任意其他数据

HTTP响应:

1
<status line>    //状态行:状态码表示响应状态
<headers>    // 响应头:服务器返回请求头中需要的信息
<blank line>    // 空行
<response-body>    // 响应体:请求返回的数据

常见的状态码:

  • 200(OK):找到资源,正常返回
  • 301(Move Permanently):该资源被永久的改变了位置,通常会发送header来重定向到新的位置
  • 302(Found):该资源被临时改变了位置,通常会发送header来临时重定向到新的位置
  • 304(Not Modified):该资源上次请求之后没有任何修改,使用上次缓存的资源,用于浏览器缓存机制
  • 404(NOT FOUND):在指定位置没找到该资源
  • 500(Internal Server Error):服务器程序码出错

看完了HTTP包结构之后,我们再来看看get和post的其他区别

2.参数位置

get请求的数据附在URL之后,即HTTP协议头,以?分割url和传送数据,用&连接多个参数,数据如果是英文或者数字,则原样发送,空格转换为+,其他则转换为base64编码

post请求把数据则在HTTP请求包体中,以键值对的形式传送

3.缓存机制

get请求能够被缓存,请求会保存到浏览器的浏览记录中

post并不能被缓存

4.传输数据长度

get没有长度限制,因为HTTP请求没有限制URL长度,但是浏览器有限制URL长度,例如IE限制的长度为2k(2048字节)

post请求数据长度浏览器这边没有限制,但是服务器那边会对提交数据大小进行限制

5.安全性

get请求数据使用base64编码,显示在URL中可能造成CSRF攻击

post数据存放在request-body中,相对来说比较安全