window 自带了 window.fetch 方法, 在最新版的 Firefox 和 Chrome 中已经提供支持,其他浏览器还有兼容性问题,要做兼容性处理。

一、fetch 安装

为了解决 fetch 的兼容性,我们使用 Fetch Polyfill 的版本  whatwg-fetch。

npm install --save whatwg-fetch
import 'whatwg-fetch'

也可以用另一个 fetch 版本 isomorphic-fetch

npm install --save isomorphic-fetch
import fetch from "isomorphic-fetch";

二、fetch 的基本使用

// url (必须), init对象 (可选)
fetch(url, init).then(function(res) {
    // fetch第一次拿到的是整个Response对象,要调用json()方法转成含有json数据的Promise
    return res.json();
}).catch(function(err) {
    // 中途任何地方出错...在此处理

GET 请求

fetch('http://localhost:8082/data/users.json?id=99')
  .then(function(res) {
    return res.json();
  .then(function(myJson) {
    console.log(myJson);

POST请求

请求参数以json形式传给后端

fetch('/api/getItems', {
    body: JSON.stringify(params), //json字符串和对象都可以,推荐使用json字符串,这样可以在控制台network里看到请求参数
    cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached
    credentials: 'include', // include, same-origin, *omit
    headers: {
      'Content-Type': 'application/json'
    method: 'POST'
  }).then(response => response.json()).then(res => {
      console.log(res)

请求参数以formData形式传给后端

import qs from 'query-string';
fetch('/api/getItems', {
    body: qs.stringify(params), //使用query-string把参数转换成'name=jim&age=22'形式,也可以直接用formData格式作为参数
    cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached
    credentials: 'include', // include, same-origin, *omit
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
    method: 'POST'
  }).then(response => response.json()).then(res => {
      console.log(res)

可以通过HTML<input type="file" />元素,FormData() 和fetch()上传文件。

var formData = new FormData();
var fileField = document.querySelector("input[type='file']");
formData.append("username", "abc123");
formData.append("avatar", fileField.files[0]);
fetch("/api/uploadFile", {
  method: "PUT",
  body: formData
  .then(response => response.json())
  .catch(error => console.error("Error:", error))
  .then(response => console.log("Success:", response));

new FormData() 可以直接传一个 form 元素作为参数。

body: new FormData(document.getElementById('myForm'))

上传多个文件

var formData = new FormData();
var photos = document.querySelector("input[type='file'][multiple]");
formData.append('title', 'My Vegas Vacation');
formData.append('photos', photos.files);
fetch('https://example.com/posts', {
  method: 'POST',
  body: formData
.then(response => response.json())
.then(response => console.log('Success:', response))
.catch(error => console.error('Error:', error));

三、自定义请求对象

除了传给 fetch() 一个url,你还可以通过使用 Request() 构造函数来创建一个 request 对象,然后再作为参数传给 fetch()

var myHeaders = new Headers();
var myInit = { 
    method: 'GET',
    headers: myHeaders,
    mode: 'cors',
    cache: 'default' 
var myRequest = new Request('/api/getItems', myInit);
fetch(myRequest).then(function(response) {
  return response.json();
}).then(function(res) {
    console.log(res)

Request() 和 fetch() 接受同样的参数。你甚至可以传入一个已存在的 request 对象来创造一个拷贝:

var anotherRequest = new Request(myRequest,myInit);

这个很有用,因为 request 和 response bodies 只能被使用一次(译者注:这里的意思是因为设计成了 stream 的方式,所以它们只能被读取一次)。创建一个拷贝就可以再次使用 request/response 了,当然也可以使用不同的 init 参数。

注意clone() 方法也可以用于创建一个拷贝。它在语义上有一点不同于其他拷贝的方法。其他方法(比如拷贝一个 response)中,如果 request 的 body 已经被读取过,那么将执行失败,然而 clone() 则不会失败。

        当接收到一个代表错误的 HTTP 状态码时,从 fetch()返回的 Promise 不会被标记为 reject, 即使该 HTTP 响应的状态码是 404 或 500。相反,它会将 Promise 状态标记为 resolve (但是会将 resolve 的返回值的 ok 属性设置为 false ),仅当网络故障时或请求被阻止时,才会标记为 reject。当状态码在200-299之间时,ok 属性才会返回 true。

        默认情况下,fetch 不会从服务端发送或接收任何 cookies, 如果站点依赖于用户 session,则会导致未经认证的请求(要发送 cookies,必须设置 credentials 选项为 include)。自从2017年8月25日后,默认的credentials政策变更为same-originFirefox也在61.0b13中改变默认值

五、Init 对象

一个配置项对象,包括所有对请求的设置。可选的参数有:

1. method - 支持 GETPOSTPUTDELETEHEAD

2. headers - 对应的 Headers 对象

3. body - 请求参数

4. credentials - 设置 cookies 是否随请求一起发送。

   可选值: omit: (默认, 不发送 Cookie)

       same-origin:同域下自动发送 Cookie

       include:始终发送 Cookie,即使是跨域。

5. mode - 是否允许跨域请求,以及哪些响应的属性是可读的。

    可选值:cors(默认, 允许跨域请求,将遵守 CORS 协议

        no-cors该模式允许来自 CDN 的脚本、其他域的图片和其他一些跨域资源。前提条件是请求的 method 只能是 HEAD、GET 或 POST。而且 js 不能访问 Response 对象中的任何属性

                 same-origin:要同源,不允许跨域

        navigate:支持导航的模式,仅用于 HTML 导航。

6. cache - 设置缓存模式。

    可选值: default:浏览器在其 HTTP 缓存中查找匹配的请求。

             a. 如果匹配并且是新鲜的,它将从缓存中返回。

             b. 如果存在匹配但已失效,则浏览器将向远程服务器发出有条件的请求。如果服务器指出资源没有改变,它将从缓存中返回。否则资源将从服务器下载并且缓存将被更新。

             c. 如果没有匹配,浏览器将发出正常的请求,并且下载的资源更新缓存。

         no-store:浏览器从远程服务器获取资源,而不先查看缓存,并且不会使用下载的资源更新缓存。

         reload:浏览器从远程服务器获取资源,而不先查看缓存,但随后将使用下载的资源更新缓存。

         no-cache:浏览器在其 HTTP 缓存中查找匹配的请求。

             a. 如果匹配,新鲜或陈旧,浏览器将向远程服务器发出有条件的请求。如果服务器指出资源没有改变,它将从缓存中返回。否则资源将从服务器下载并且缓存将被更新。

             b. 如果没有匹配,浏览器将发出正常的请求,并用下载的资源更新缓存。

         force-cache:浏览器在其 HTTP 缓存中查找匹配的请求。

             a. 如果有匹配,新鲜或陈旧,它将从缓存中返回。

             b. 如果没有匹配,浏览器将发出正常的请求,并用下载的资源更新缓存。

         only-if-cached:浏览器在其 HTTP 缓存中查找匹配的请求。只能用在 mode 为 same-origin 的情况下

             a. 如果匹配,新鲜或陈旧,将从缓存中返回。

             b. 如果没有匹配,浏览器将返回一个错误。

7. referrer - 请求的引用者(例如:client)

8. redirect - 定义重定向处理方式。

      可选值:follow(默认), error, manual。

9. integrity - 子资源完整性值。

六、Body

不管是请求还是响应都能够包含body对象. body也可以是以下任意类型的实例

Body 类定义了以下方法 (这些方法都被 Request 和Response所实现)以获取body内容. 这些方法都会返回一个被解析后的Promise对象和数据.

fetch("/api/getItems").then(res => {
  return res.json();

参考文献:https://developer.mozilla.org/zh-CN/docs/Web/API/Fetch_API/Using_Fetch

原生fetch虽然已经支持 promise 了,相比 XMLHttpRequest 已然好用了很多,但是参数还是需要自己处理,比较麻烦。通过数据流(Stream对象)处理数据,可以分块读取,有利于提高网站性能,对于大文件或者网速慢的场景极为有用。采用了模块化设计,API分散于多个对象中(如:Response对象、Request对象、Header对象)Response 对象根据服务器返回的不同类型的数据,提供了不同的读取方法。,此外还可以接收第二个参数,作为配置对象,可以自定义发出的HTTP请求。 因为涉及的是插件开发,在Background中调用Fetch,此时是没有域名的,而之前无论用Ajax发送请求的时候,也不能直接自己指定Cookie传到服务端,这里应该区分对待前端http.request和后端request请求,前端因为受到平台浏览器的约束,对某些功能是不放开的,尤其是调用浏览器本身自带的对象,是有底层约束的,所以不能自定义敏感Cookie这种事情,自然是解决不了的,这也是之前的知识判断失误 1、fetch是一个类似于Promise功能的web接口实现方式,目前除了IE浏览器,其他的高版本的浏览器都支持。官方是这样描述Fetch的:Fetch API提供了一个获取资源的API接口(包括跨网络),任何使用过XMLHttpRequest的是都会熟悉它,但是它提供了更强大和更灵活的功能集。 转载:前后端数据交互(四)——fetch 请求详解 - 前端人 - 博客园 fetch 是 XMLHttpRequest 的升级版,使用js脚本发出网络请求,但是与 XMLHttpRequest 不同的是,fetch 方式使用 Promise,相比 XMLHttpRequest 更加简洁。所以我们告别XMLHttpRequest,引入 fetch 如何使用? 一、fetch介绍 fetch() 是一个全局方法,提供一种简单,合理的方式跨网络获取资源。它的请求是基于 Promise 的,需要详细学习 P fetch基本使用方法 1,fetch与ajax作用相同,发送请求 2,ajax是使用XMLHttpRequest对象来请求数据 因此需要先new XMLHttpRequest();然后连接发送接收 3,fetch是一个方法 fetch(‘地址’) 即可发送一个请求 4,fetch 的返回格式采用的是Promise分格 因此可以 fetch(‘地址’) .then() 之后可以一直then() then方法返回的也是Promise 5,fetch(‘地址’) .then(结果=>{ fetch()是 XMLHttpRequest 的升级版,用于在 JavaScript 脚本里面发出 HTTP 请求 fetch('url') .then(response => response.json()) .then(data => console.log(data)) 在用法上,fetch()接受一个 URL 字符串作为参数,默认向该网址发出 GET 请求,返回一个 Promise 对象,支持.then的链式写法 二 · Respon 原文链接:css-tricks.com/using-fetch… 。 本文介绍了Fetch基本使用方法及zlFetch库的使用 无论用JavaScript发送或获取信息,我们都会用到Ajax。Ajax不需要刷新页面就能发送和获取信息,能使网页实现异步更新。 几年前,初始化Ajax一般使用jQuery的ajax方法: $.ajax('some-url', { success: (data) ... 影响点:对引用静态实例的store有影响,比如进入编辑页调用info接口,接口还在pending时切出去,点击新建(新建和编辑使用的同一个公共组件和同一个store),新建页面展示info接口的值; 可通过AbortController 控制一个或多个web请求;具体AbortController - Web API 接口参考 | MDN 以下三条关键点: 1.@observable abortController: any= new AbortController(); const fetc function sendResquest(urls, max, callback) { let urlsCopy = [... urls];//防止影响外部urls变量 function request() { function Handle () {...