请求方法的本质
请求方法是请求行中的第一个单词,它向服务器描述了客户端发出请求的动作类型。在 HTTP 协议中,不同的请求方法只是包含了不同的语义,但服务器和浏览器的一些约定俗成的行为造成了它们具体的区别。
fetch('https://www.baidu.com', {
method: 'heiheihei', // 告诉百度,我这次请求是来嘿嘿嘿的
});
上面的请求中,我们使用了自定义请求方法 heiheihei
。虽然百度服务器无法理解这样的请求是在干什么,但这样的请求也是可以正常发送到百度服务器的。
在实践中,客户端和服务器慢慢的形成了一个共识,约定俗成的规定了一些常见的请求方法:
GET
:表示向服务器获取资源。业务数据在请求行中,无须请求体POST
:表示向服务器提交信息,通常用于产生新的数据,比如注册。业务数据在请求体中PUT
:表示希望修改服务器的数据,通常用于修改。业务数据在请求体中DELETE
:表示希望删除服务器的数据。业务数据在请求行中,无须请求体OPTIONS
:发生在跨域的预检请求中,表示客户端向服务器申请跨域提交HEAD
:只返回响应头,无须响应体TRACE
:回显服务器收到的请求,主要用于测试和诊断CONNECT
:用于建立连接管道,通常在代理场景中使用,网页中很少用到
GET 和 POST 的区别
由于浏览器和服务器约定俗称的规则,造成了 GET
和 POST
请求在 Web 中的区别:
- 浏览器在发送
GET
请求时,不会附带请求体 GET
请求的传递信息量有限,适合传递少量数据;POST
请求的传递信息量是没有限制的,适合传输大量数据。- 主要是对请求行 + 请求头的大小有限制
- 请求体大小没有限制
GET
请求只能传递 ASCII 数据,遇到非 ASCII 数据需要进行编码;POST
请求没有限制- 大部分
GET
请求传递的数据都附带在 path 参数中,能够通过分享地址完整的重现页面,但同时也暴露了数据,若有敏感数据传递,不应该使用GET
请求,至少不应该放到 path 中 - 刷新页面时,若当前的页面是通过
POST
请求得到的,则浏览器会提示用户是否重新提交。若是GET
请求得到的页面则没有提示。- 如果打开开发者工具,则浏览器不会提示是否重新提交
GET
请求的地址可以被保存为浏览器书签,POST
不可以