浅析 fetch

543 阅读2分钟

简介

fetch 不是 ajax,是浏览器新提供的一个API,是基于Promise设计,旧浏览器不支持 Promise。并且 fetch 的出现是为了取代 ajax 。

备注:如果低版本的浏览器需要兼容 fetch,需要使用 pollyfill es6-promise

基本使用

fetch(url, options).then(function(response) { 
// handle HTTP response
}, function(error) {
 // handle network error
})

说明:

  • fetch api返回的是一个promise对象
  • Options:
    • method(String): HTTP请求方法,默认为GET
    • body(String): HTTP的请求参数
    • headers(Object): HTTP的请求头,默认为{}
    • credentials(String): 默认为 omit,忽略的意思,也就是不带 cookie ;还有两个参数,same-origin ,意思就是同源请求带 cookie ;include,表示无论跨域还是同源请求都会带cookie
  • 第一个 then 函数里面处理的是 response的格式,这里的response具体如下:
  • status(number): HTTP返回的状态码,范围在100-599之间
  • statusText(String): 服务器返回的状态文字描述,例如Unauthorized,上图中返回的是Ok
  • ok(Boolean): 如果状态码是以2开头的,则为true
  • headers: HTTP请求返回头
  • body: 返回体,这里有处理返回体的一些方法
    • text(): 将返回体处理成字符串类型
    • json(): 返回结果和 JSON.parse(responseText)一样
    • blob(): 返回一个Blob,Blob对象是一个不可更改的类文件的二进制数据
    • arrayBuffer()
    • formData()

兼容性

fetch 兼容性查看

如 caniuse 所示,IE 浏览器完全不支持 fetch ,移动端的很多浏览器也不支持,所以,如果要在这些浏览器上使用 Fetch,就必须使用fetch polyfill

  • cookie 传递
    • 必须在 header 参数里面加上 credentials: 'include',才会如 xhr 一样将当前 cookies 带到请求中去
  • fetch和xhr的不同
    • fetch 虽然底层,但是还是缺少一些常用 xhr 有的方法,比如能够取消请求(abort)方法
    • fetch 在服务器返回 4xx、5xx 时是不会抛出错误的,这里需要手动通过,通过 response 中的 ok 字段和 status 字段来判断

参考资料

  1. developer.mozilla.org/zh-CN/docs/…
  2. segmentfault.com/a/119000000…
  3. github.com/mdn/fetch-e…
  4. www.w3cschool.cn/fetch_api/f…