更好阅读体验可移步个人博客:Blog前端
传递信息到服务器,从服务器获取信息,是前端发展的重中之重,尤为是如今先后端分离的大前提下,先后端的数据交互是前端的必修科目了。从好久以前到如今,ajax都是每一个前端入行者必须技能。固然为了便于开发者, 各类三方工具将ajax包装,而后给开发者使用,jquery、axios等等。这都不是今天的重点, 今天要说一个JavaScript原生的获取资源接口 Fetch API, 虽然各大浏览器支持率不高,可是这样的一个概念确实值得了解学习,而且如今咱们能够经过polyfill来实现不一样浏览器的兼容性问题jquery
先来看看各个浏览器对fetch的原生支持状况,能够看到支持性并非很高,safari在10.1 以后才支持,ios更是10.3以后才支持,IE彻底不支持。固然新技术的发展总会经历这个过程。不过,想提早尝尝鲜也是能够的咱们可使用 polyfillios
声明:如下的全部代码测试都是基于 Chrome 实现git
废话很少说,github
fetch 返回的是一个Promise,咱们先来看一个基本的 fetch 结构ajax
fetch(url, option).then( res => { //do something }).catch(err => { //do something })
fetch 的url 参数是必须的,option参数可选
以上就是整个的请求以及处理过程, 惊不惊喜,意不意外,没错就是这么简单清晰明了,没有原生ajax的那些 XMLHttpRequest
bulabula 一大堆。也不须要再额外引入一个jquery包(固然项目中使用到的话除外)。固然由于fetch的返回值是一个Promise, 不须要再去使用回调函数从而有效避免回调地狱。json
固然,fetch不止于此,咱们的需求也不止于此,咱们可能须要post请求,可能须要跨域请求,控制从服务器获取的信息的格式(json、string、blob等),此时,便须要设置参数信息,对返回信息进行处理。axios
来看看fetch的可选参数option的可选值,fetch默认是get方法,也能够在option中设置为其余方法后端
mode 参数便于 CORS, 设置不一样的值可使在不一样的请求方式下,使得请求有效。api
fetch("https://api.github.com/users/mzabriskie", {mode: "no-cors"}).then(response => { return response; }).then(function(data) { console.log(data); }).catch(function(e) { console.log("Oops, error"); });
执行以上代码返回
fetch("https://api.github.com/users/mzabriskie", {mode: "cors"}).then(response => { return response; }).then(function(data) { console.log(data); }).catch(function(e) { console.log("Oops, error"); });
以上代码返回
该参数的值能够为对象字面量
headers: { "Content-Type": "application/json" }
也能够建立 Headers 对象,经过append() 和delete() 等方法对其进行操做,
var headers = new Headers(); headers.append( "Content-Type", "application/json"); fetch(url, { method: post, headers: headers, body: { name: "jack" } })
Fetch 提供了对 Request 和 Response (以及其余与网络请求有关的)对象的通用定义。因此在一个Fetch请求中,彻底能够只使用Request 和 Response两个对象,经过Request 设置参数,经过Response 对返回值进行处理。
一个Fetch还能够写成如下形式
var myHeaders = new Headers(); myHeaders.append('Content-Type', 'image/jpeg'); var option = { method: 'GET', headers: myHeaders, mode: 'cors', cache: 'default' }; var myRequest = new Request('https://api.github.com/users/mzabriskie',option); fetch(myRequest).then(function(response) { ... });
参数设置如 option 下介绍
Fetch API 的Response接口呈现了对一次请求的响应数据
其包含一次请求的响应信息,响应状态等。
包含的一些经常使用属性(只读)
方法
Response可使用如下方法,对响应数据进行处理
arrayBuffer()、blob()、formData()、json()、text()等
如下为使用json() 方法返回的数据信息
fetch("https://api.github.com/users/mzabriskie", {mode: "no-cors"}).then(response => { return response.json(); }).then(function(data) { console.log(data); }).catch(function(e) { console.log("Oops, error"); });
同XMLHttpResponse同样,请求发出,服务器发出返回码,除了407之外,其不会进入错误捕捉。也就是说除了网络故障或者跨域请求被拒绝等请求失败的状况,fetch() 的Promise是不会 reject的,因此为了请求能按照咱们的预期实现,咱们必须加一个判断,判断请求是否成功并返回了咱们想要的数据。咱们固然能够像 XMLHttpResponse 同样对响应的状态码进行判断,不过咱们还有选择,对response.ok 这个布尔值入手。
细心的同窗可能从以前的截图中看到,在请求成功和失败的状况下,属性 ok 的值 分别为true 和false 这里就不赘余天价截图了,上代码
fetch("https://api.github.com/users/mzabriskie", {mode: "cors"}).then(response => { if(response.ok) { response.json().then(data => { console.log(data); }); } else { console.log("请求不成功,状态码为", response.status); } }).catch(function(e) { console.log("Oops, error"); });
致此, 一个 fetch 的简单请求便完成了,可是fetch功能远不止这些
fetch 与 ES7的async/await 搭配使用等等,路很长一步一脚印
Fetch API - Web API 接口 | MDN
Request - Web API 接口 | MDN
Headers - Web API 接口 | MDN
Response - Web API 接口 | MDN
Body - Web APIs | MDN