Fetch API的用法

2018-01-22  本文已影响1568人  microkof

前言

Fetch API是新的ajax解决方案,用于解决古老的XHR对象不能实现的问题。

主要优点:

本文注意事项:

适用浏览器

image.png

可见,浏览器的支持并不好,可以说相当不好,不过你可以使用各种垫片(polyfill)来实现Fetch API,具体可以搜索一下fetch api polyfill。不过,我建议:

最简单典型的用法

本文假设一个服务器环境,有一个1.html和一个1.php。

fetch('1.php') 
    .then(function(res) { 
        res.json().then(function(data) { 
            console.log(data); 
        }); 
    }) 
    .catch(function(err) { 
        console.log('Fetch Error : %S', err); 
    })

Fetch API跟Promises的关系

console.log(fetch('1.php')); // 返回一个Promise对象

两者关系就一句话:fetch()本身就返回一个Promise对象。所以,它就可以用Promises的所有方法。

fetch的参数

第一个参数:毫无疑问是要获取资源的URL。

第二个参数:options对象,包括:

上面诸多option中,其实常用的就是methodheadersbody以及mode等。

headers

可以为Headers对象,也可以是一个对象字面量,通常情况下对象字面量就足够。

按下F12,查看Network,查看某个请求,可以看到请求头的内容,比如:

Accept:*/*
Accept-Encoding:gzip, deflate, br
Accept-Language:zh-CN,zh;q=0.9
Connection:keep-alive
Content-Length:208
Content-Type:application/x-www-form-urlencoded; charset=UTF-8
......

设置请求头的伪代码例子:

var url = 'http://......';

var headers = {
    Accept: 'image/jpeg'
};

fetch(url, {headers: headers}).then(function () {
  // ...
})

body

也就是请求体,从上文可以看到,支持的请求体格式非常多,也支持文件上传。可以把文件转为blob,也可以把文件添加到FormData对象中,然后上传。

mode

  1. same-origin表示必须同源,绝对禁止跨域,这个是老版本浏览器默认的安全策略。
fetch('1.php', {
    mode: 'same-origin'
}).then(function (response) {
    console.log(response);
});
image.png
  1. cors表示允许跨域,顾名思义它是以CORS的形式跨域;当然该模式也可以同域请求。只需要服务器的响应头中带有Access-Control-Allow-Origin: *就行。
fetch('http://外域/1.php', {
    mode: 'cors'
}).then(function (response) {
    console.log(response);
});
image.png
  1. no-cors这个就很特殊了,字面意思是禁止以CORS的形式跨域,其实它的效果是,对外域的请求可以发送,外域服务器无论设不设Access-Control-Allow-Origin: *都会接收请求并处理请求,但是浏览器不接收响应,即使外域返回了内容,浏览器也当做没接到。

这个no-cors的用途是保证数据安全。

fetch('http://外域.com/1.php', {
    mode: 'no-cors'
}).then(function (response) {
    console.log(response);
});
image.png

Response

从上面截图可以看到,传给then的回调函数可以接收一个参数,这个参数就是Response,它的属性基本上是只读属性。

上图中看不到的是Response的方法,它的方法如下:

Response.clone()

创建一个Response对象的克隆

Response.error()

返回一个绑定了网络错误的新的Response对象

Response.redirect()

用另一个URL创建一个新的 response.

Response.arrayBuffer()

读取 Response对象并且将它设置为已读(因为Responses对象被设置为了 stream 的方式,所以它们只能被读取一次) ,并返回一个被解析为ArrayBuffer格式的promise对象

Response.blob()

读取 Response对象并且将它设置为已读(因为Responses对象被设置为了 stream 的方式,所以它们只能被读取一次) ,并返回一个被解析为Blob格式的promise对象

Response.formData()

读取Response对象并且将它设置为已读(因为Responses对象被设置为了 stream 的方式,所以它们只能被读取一次) ,并返回一个被解析为FormData格式的promise对象

Response.json()

读取 Response对象并且将它设置为已读(因为Responses对象被设置为了 stream 的方式,所以它们只能被读取一次) ,并返回一个被解析为JSON格式的promise对象

Response.text()

读取 Response对象并且将它设置为已读(因为Responses对象被设置为了 stream 的方式,所以它们只能被读取一次) ,并返回一个被解析为USVString格式的promise对象

上一篇 下一篇

猜你喜欢

热点阅读