mengtuifrontend / Blog

芦叶满汀洲,寒沙带浅流。二十年重过南楼。柳下系船犹未稳,能几日,又中秋。 黄鹤断矶头,故人今在否?旧江山浑是新愁。欲买桂花同载酒,终不似,少年游。
18 stars 5 forks source link

Fetch #19

Open shenxuxiang opened 5 years ago

shenxuxiang commented 5 years ago

Fetch

在开发过程中,我们向服务端发送请求,一般会使用三种方式, XMLHttpRequest(XHR),Fetch ,jQuery实现的AJAX。其中, XMLHttpRequest(XHR)和Fetch是浏览器的原生API,它们都是全局的方法。jquery的ajax其实是封装了XHR。接下来我们来看看Fetch如何使用。

写在前面

兼容性

image

isomorphic-fetch

需要支持的话,我们可以在项目中引入isomorphic-fetch,isomorphic-fetch 是对 whatwg-fetch和node-fetch的一种封装,你一份代码就可以在两种环境下跑起来了。

fetch()的使用

第一个参数是一个请求的url。第二个参数是一个可选参数,可以控制不同配置的 init 对象。方法返回一个 promise 对象。

init 对象有哪些属性

如果要在请求中携带凭据,请添加credentials: 'include'。如果你只想在请求URL与调用脚本位于同一起源处时发送凭据(cookie),请添加credentials: 'same-origin'。要确保浏览器不在请求中包含凭据,请使用 credentials: 'omit',这个也是默认值

返回的response有哪些属性

用途

文件上传

  var formData = new FormData();
  var photos = document.querySelector("input[type='file'][multiple]");

  formData.append('title', 'My Vegas Vacation');
  // 注意这里上传的是多个文件
  formData.append('photos', photos.files);

  fetch(url, {
    method: 'POST',
    body: formData
  })
    .then(response => {
      if (response.ok) {
        return response.json();
      }
      throw 'the qequest failed';
    })
    .then(response => console.log('Success:', response))
    .catch(error => console.error('Error:', error));

文件下载

  fetch(url, {
    method: 'POST',
    body: JSON.stringify(query),
  })
    .then(response => {
      if (response.ok) {
        return response.blob();
      }
      throw 'the qequest failed';
    })
    .then(data => {
        const blobURL = window.URL.createObjectURL(data);
        download(blobURL);
    })
    .catch(error => console.error('Error:', error));

  function download(url) {
    const a = document.createElement('a');
    a.style.display = 'none';
    a.download = '<文件名>';
    a.href = url;
    a.click();
    document.body.appendChild(a);
    document.body.removeChild(a);
  }

最后