请求

159 阅读2分钟

一、基础知识点

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)。

参考资料: