美文网首页
从 XMLHttpRequest 到 Fetch 操纵 HTTP

从 XMLHttpRequest 到 Fetch 操纵 HTTP

作者: 辣辣不乖 | 来源:发表于2021-12-09 08:25 被阅读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));
    
    • response.text():得到文本字符串。

    • response.json():得到 JSON 对象。

    • response.blob():得到二进制 Blob 对象。

    • response.formData():得到 FormData 表单对象。

    • response.arrayBuffer():得到二进制 ArrayBuffer 对象。

    支持的请求参数

    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 改写

    • await 必须放到函数里
    • 函数必须有 async 修饰符
    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);
      }
    }
    

    相关文章

      网友评论

          本文标题:从 XMLHttpRequest 到 Fetch 操纵 HTTP

          本文链接:https://www.haomeiwen.com/subject/ckxcfrtx.html