GET和POST方法有什么区别?

GETPOST是HTTP请求中最常用的方法,它们都可以用于向服务器传递参数。最明显的区别就是GET方法传递的参数会出现在URL中,而POST则不会。除此之外,还有其它什么区别呢?为什么说POST比GET方法安全?

HTTP请求协议

为了更加直观地叙述GET方法和POST方法的区别,先看一下HTTP请求协议的格式:

以上是向服务器传递“name=mao,sex=M”这两个参数的POST请求的例子。如果改为使用GET参数,对应的HTTP请求如下:

1
2
3
4
5
6
7
GET /index.php?name=mao&sex=M HTTP/1.1
Host: www.web-security.cn
Accept: text/html, application/xhtml+xml, image/jxr, */*
Accept-Language: zh-Hans-CN,zh-Hans;q=0.5
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko
Accept-Encoding: gzip, deflate
Connection: Keep-Alive

从上述协议可以看出,HTTP请求方法出现在HTTP请求的第一行。请求方法后面分别是请求资源的位置、HTTP协议的版本(例子中为HTTP/1.1),它们使用空格隔开。

GET和POST的共同点

  • GET和POST都是HTTP的请求方法,除此之外HTTP还有其它请求方法,例如:HEAD、PUT、DELETE、CONNECT、OPTIONS、PATCH等。
  • GET和POST都能向服务器传递参数。

GET和POST的区别

  • 最明显的,GET请求的参数会出现在URL中,而POST请求则不会。
  • 在HTTP协议中,GET请求没有请求主体(Request Body),而POST请求可以有请求主题。
  • 使用POST方法时,也可以使用与GET方法一样的方式传递数据。
  • 使用GET方法能够传递的参数长度有限制,一般在2k~64k(与Web服务器有关),超过长度会提示414 Request-URI Too Large。而POST方法能够传递的数据没有大小限制。
  • POST可以用来上传文件,GET方法不可以。
  • GET请求可以被浏览器缓存,而POST请求不会被缓存。
  • GET请求一般用于获取资源(例如获取首页、获取文章内容、获取图片等),而POST请求用于向服务器传递资源(发送帐号密码、发布文章、上传文件等)。
  • 一般来说,GET请求是幂等的,而POST请求是非幂等的。例如,使用GET请求获取文章内容,获取一次和多次结果是一样的;使用POST请求进行转账,转账一次和多次结果不一样。
  • 在刷新网页的时候,如果是POST请求,会提示“确认重新提交表单”:

为什么说POST比GET更安全?

原因是 - GET请求参数会出现在URL中。这意味着:

  • 如果使用GET方法向服务器提交密码,密码将直接显示在浏览器地址栏中;
  • 带有密码的GET请求可能出现在浏览器历史记录中,而POST请求中的密码不会被保存到历史记录;
  • 如果将带有密码的GET请求地址分享出去,别人将会看到密码。
  • 由于POST请求不是幂等的,刷新网页时浏览器会提示“确认重新提交表单”, 防止误操作。
  • 恶意用户可以很轻易地修改GET参数(直接在浏览器地址栏中修改),如果使用POST方式,难度将升高一点点。

如何使用GET和POST?

建议如下:

  • 使用GET来获取资源,例如获取文章内容、获取列表信息、获取头像;
  • 使用POST来上传、更新资源,例如发布文章、修改文章、更新个人信息;
  • 使用POST来传递隐私信息,例如用户名、密码;
  • 使用POST来处理非幂等的请求,例如转账、发送消息、留言等。