一、基础知识点
1、安全
An HTTP method is safe if it doesn't alter the state of the server. 安全的判断条件是它是否会造成服务器状态的改变。
那么根据这一判断条件可知GET、HEAD、OPTIONS请求都是安全的,因为它们并会造成服务器端数据状态的改变。而POST、PUT、DELETE请求会造成服务器端数据的改变,所以不安全的。
2、幂等
An HTTP method is idempotent if the intended effect on the server of making a single request is the same as the effect of making several identical requests. 幂等的判断条件是一次请求和多次请求的效果是一样的。
这里有两点需要注意:
- PUT、DELETE是幂等的(之前以为不是幂等的),PUT请求会在服务器上替换/生成一个资源,多次请求都是一样的,比如我要生成一个资源,请求十次八次都只是生成一个资源。DELETE同理。而POST不是。
- 安全的请求方式一定是幂等的,但幂等的请求方式不一定是安全的,如PUT、DELETE。
POST请求不幂等的原因:

3、可缓存性
A cacheable response is an HTTP response that can be cached, that is stored to be retrieved and used later, saving a new request to the server. 可缓存性的判断条件是一个请求的响应能够被缓存,供之后重复使用。
- GET、HEAD请求是可以缓存的。
- POST、PATCH请求只有在设置了一个新鲜值(我认为是Etag)和Content-Location之后,才能进行缓存。
- PUT、DELETE请求是不可缓存的。
- 200, 203, 204, 206, 300, 301, 404, 405, 410, 414, 501这些状态码对应的请求也是能够缓存的。
注意点
- 可缓存的请求一旦设置Cache-control为no-cache之后,就不再能缓存。
- PUT、DELETE能够致使同URL的GTE、HEAD请求的缓存失效。
二、fetch
fetch是一个全局API,相比于XMLHttpRequest和jQuery.ajax,fetch拥有更好的体验。 fetch返回的是一个Promise对象,这就保证了只要响应的headers存在,即使返回的状态码不在200-299之内,也不会报错,只会将响应的ok属性设置为false。
关于cookie的特点:
- 在跨域请求中,不会携带cooke。
- 跨域请求的响应不能设置cookie。
- 截止到2018年8月,只有同源请求才会携带cookie,Firefox在61.0b13中才实现。
关于请求的特点:
- fetch的响应是整个HTTP response,所以我们要使用response.json()提取出响应的JSON body。
- 不能监听progress(的使用XMLHTTPRequest或者axios)。
参考资料: