前言
这个问题看上去特别初级,但实际上却涉及到方方面面,也是面试官特别喜欢考的原因之一。既然如此,那就让我们来一起彻底理清楚他们的区别。
首先,我们先科普一些知识点。
什么是 HTTP
HTTP
超文本传输协议,是一个简单的请求-响应协议,它通常运行在 TCP
之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。
HTTP请求方法
序号 | 方法 | 描述 |
---|---|---|
01 | HEAD | 请求指定的页面信息,并返回实体主体。 |
02 | GET | 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头。 |
03 | POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立或已有资源的修改。 |
04 | PUT | 从客户端向服务器传送的数据取代指定的文档的内容。 |
05 | DELETE | 请求服务器删除指定的页面。 |
06 | CONNECT | HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。 |
07 | OPTIONS | 允许客户端查看服务器的性能。 |
08 | TRACE | 回显服务器收到的请求,主要用于测试或诊断。 |
09 | PATCH | 是对 PUT 方法的补充,用来对已知资源进行局部更新。 |
知识已经科普的差不多了,接下来,让我们一起分析 GET
请求把。
GET 请求
- 它是
HTTP
常见的请求类型,最常见于向服务器查询某些信息。 - 可以将查询参数追加到
URL
末尾,以便将信息发送给服务器。 - 对查询字符串的格式有要求,每个参数名称和值必须使用
encodeURIComponent
进行编码,才能放到URL
末尾,必须用&
符号隔开。例如:baidu.com/index.php?name=111&id=222 - GET请求产生一个数据包。对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据)
POST请求
- 它是
HTTP
常见的请求类型,最常见于向服务器发送应该被保存的信息或者查询某些信息。 - 可以添加请求参数,将请求参数添加到body中。
POST
请求产生2个数据包,在火狐浏览器中,产生一个数据包。
GET请求和POST请求的差别
GET
请求的请求参数是添加到head
中,可以在url
中可以看到;POST
请求的请求参数是添加到BODY
中,在url
中不可见。GET
请求参数需要使用encodeURIComponent
进行编码,必须用&
符号隔开。- 请求的
url
有长度限制,这个限制由浏览器和web
服务器决定和设置的。例如IE浏览器对URL
的最大限制为2083个字符,如果超过这个数字,提交按钮没有任何反应。因为GET
请求的参数是添加到URL
中,所以GET
请求的URL
的长度限制需要将请求参数长度也考虑进去。而POST
请求不用考虑请求参数的长度。 GET
请求产生一个数据包;POST
请求产生2个数据包,在火狐浏览器中,产生一个数据包。这个区别点在于浏览器的请求机制,先发送请求头,再发送请求体。因为GET
没有请求体,所以就发送一个数据包,而POST
包含请求体,所以发送两次数据包,但是由于火狐机制不同,所以发送一个数据包。- 由于
GET
请求的参数是在url
中,所以可以直接在浏览器中打开 GET
请求会被浏览器主动缓存下来,留下历史记录,而POST
默认不会。GET
是幂等的,而POST
不是。(幂等表示执行相同的操作,结果也是相同的)
GET请求和POST请求的使用场景
如果想要查询的更快,可以使用GET
请求。
其他的,并无差别。
留言解惑
由于有些小伙伴给我留言,说部分内容存在差异,这边统一说明下。
- 问题1:GET 请求可以支持 BODY 传递请求参数的。博主却没有提及。
解答:
1.GET
请求,默认是不支持BODY
传递请求参数的。
2.你可以通过其他方式让其支持BODY
传递请求参数, 但是官方并不建议这样做。
3.毕竟这不是一个规范,也会存在未知的兼容性问题。所以我并未强调这一点,毕竟存在兼容性问题,而且还需要大量力气去开发,如果只是为BODY
传递请求参数,为什么不直接用POST
请求呢,POST
请求它不香吗?
- 问题2:GET请求、POST请求还涉及是否可以被收藏书签耶~博主没有提及。
解答:
1.GET
请求和POST
请求都可以被设置为书签的,当存在请求参数时,POST
请求无法在书签中体现请求参数后的结果。因为POST
的请求参数在BODY
中。
2.在实际项目开发中,大部分接口都是需要验证身份信息的。这个时候添加书签的意义就不是很大。因为信息都会获取不到。
3.博主认为这并不是一个很大的区别点,理由如上,所以并未涉及。