GET
和POST
是HTTP请求中最常用的方法,它们都可以用于向服务器传递参数。最明显的区别就是GET方法传递的参数会出现在URL中,而POST则不会。除此之外,还有其它什么区别呢?为什么说POST比GET方法安全?
HTTP请求协议
为了更加直观地叙述GET方法和POST方法的区别,先看一下HTTP请求协议的格式:
以上是向服务器传递“name=mao,sex=M”这两个参数的POST请求的例子。如果改为使用GET参数,对应的HTTP请求如下:
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来处理非幂等的请求,例如转账、发送消息、留言等。