从 XMLHttpRequest 到 Fetch 操纵 HTTP

2021-12-09  本文已影响0人  辣辣不乖

使用 Fetch

Fetch API 提供了一个 JavaScript 接口,用于访问和操纵 HTTP 管道的一些具体部分,例如请求和响应。它还提供了一个全局 fetch() 方法,该方法提供了一种简单,合理的方式来跨网络异步获取资源。

这种功能以前是使用 XMLHttpRequest 的升级版。Fetch 提供了一个更理想的替代方案,可以很容易地被其他技术使用 ......参考 MDN Fetch API 部分......

基本的 fetch 请求设置

通过网络获取一个 JSON 文件并将其打印到控制台

fetch('http://example.com/movies.json')
  .then(response => response.json())
  .then(data => console.log(data));

支持的请求参数

fetch() 接受第二个可选参数,一个可以控制不同配置的 init 对象:

// Example POST method implementation:
async function postData(url = '', data = {}) {
  // Default options are marked with *
  const response = await fetch(url, {
    method: 'POST', // *GET, POST, PUT, DELETE, etc.
    mode: 'cors', // no-cors, *cors, same-origin
    cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached
    credentials: 'same-origin', // include, *same-origin, omit
    headers: {
      'Content-Type': 'application/json'
      // 'Content-Type': 'application/x-www-form-urlencoded',
    },
    redirect: 'follow', // manual, *follow, error
    referrerPolicy: 'no-referrer', // no-referrer, *no-referrer-when-downgrade, origin, origin-when-cross-origin, same-origin, strict-origin, strict-origin-when-cross-origin, unsafe-url
    body: JSON.stringify(data) // body data type must match "Content-Type" header
  });
  return response.json(); // parses JSON response into native JavaScript objects
}

postData('404 - Not Found', { answer: 42 })
  .then(data => {
    console.log(data); // JSON data parsed by `data.json()` call
  });

检测请求是否成功

如果遇到网络故障或服务端的 CORS 配置错误时,fetch() promise 将会 reject,带上一个 TypeError 对象。虽然这个情况经常是遇到了权限问题或类似问题——比如 404 不是一个网络故障。想要精确的判断 fetch() 是否成功,需要包含 promise resolved 的情况,此时再判断 Response.ok 是否为 true。类似以下代码:

fetch('flowers.jpg')
  .then(response => {
    if (!response.ok) {
      throw new Error('Network response was not OK');
    }
    return response.blob();
  })
  .then(myBlob => {
    myImage.src = URL.createObjectURL(myBlob);
  })
  .catch(error => {
    console.error('There has been a problem with your fetch operation:', error);
  });

如上所述,Response 实例是在 fetch() 处理完 promise 之后返回的。

Response.status (默认值为 200)为response的状态码。

Response.statusText 字符串(默认值为 ""),该值与 HTTP 状态码消息对应。 注意:HTTP/2 不支持状态消息

Response.ok 如上所示,该属性是来检查 response 的状态是否在 200 - 299(包括200 和 299)这个范围内。该属性返回一个布尔值。

尊重语义使用 await 改写

async function getJSON() {
  let url = 'https://api.com/json';
  try {
    let response = await fetch(url);
    return await response.json();
  } catch (error) {
    console.log('Request Failed', error);
  }
}

const function = async () => {
  let response = await fetch('https://api.com/text');
  
  if (response.ok) {
  var data = await response.text(); 
  console.log(data);
  } else {
    throw new Error(response.statusText);
  }
}
上一篇下一篇

猜你喜欢

热点阅读