数据请求的进化之路:XMLHttpRequest->fetch

323 阅读3分钟

在JavaScript中,与服务器进行通信以拉取或发送数据是Web开发中的常见任务。随着技术的发展,我们从传统的XMLHttpRequest对象进化到了更加简洁和强大的fetch API。下面我将例举两个拉取 GitHub 组织成员信息的例子带你认识fetch API和传统的XMLHttpRequest对象。

1.  XMLHttpRequest 

XMLHttpRequest(简称XHR)是一个内置的Web API,用于在后台与服务器交换数据。它允许我们在不重新加载整个页面的情况下更新部分网页内容,这是Ajax技术的基础。

具体实现:

  • 创建 XMLHttpRequest 对象:使用new XMLHttpRequest()来实例化一个新对象。
  • 配置请求:调用open()方法来设置请求的方式(GET、POST等)、目标URL以及是否异步执行。
  • 发送请求:通过send()方法向服务器发送请求。对于GET请求,通常不需要参数,而对于POST请求,则可能需要传递数据作为参数。
  • 监听状态变化:为onreadystatechange事件添加回调函数,用于监测请求的状态变化。当readyState变为4且status为200时,表示请求成功完成,此时可以通过responseText获取返回的数据。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>XMLHttpRequest</title>
</head>
<body>
    <ul id = memberList>
    </ul>
    <script>
        const oUL = document.getElementById('memberList');
        // fetch 的前辈 XMLHttpRequest
        const xhr = new XMLHttpRequest(); // 实例化xhr请求对象
        xhr.open('GET','https://api.github.com/orgs/lemoncode/members',false); // 打开请求
        xhr.onreadystatechange = function(){ // 监听状态
            if(xhr.readyState === 4 && xhr.status === 200){ // ztate 状态 4 完成 status 状态码 200 成功
                // console.log(xhr.responseText);
                const data = JSON.parse(xhr.responseText);
                oUL.innerHTML = data.map(member => `
                <li>
                    <img src="${member.avatar_url}" alt="">
                    <span>${member.login}</span>
                </li>
                `).join('');
            }
        }
        xhr.send(); // 发送请求

    </script>
</body>
</html>

2.  fetch 

fetch是ES6引入的一个新的API,旨在简化HTTP请求操作,并提供更好的Promise支持。相比XMLHttpRequest,它具有更清晰的语法结构和更强的功能集,例如内置对JSON的支持。

具体实现:

  • 发起 fetch 请求:直接调用fetch()函数并传入目标URL,可以指定请求方法和其他选项。
  • 处理响应fetch()返回一个Promise,该Promise解析后得到的是Response对象。我们可以链式调用.json()方法将响应体解析为JSON格式。
  • 使用数据:继续链式调用另一个.then()来处理已经解析成JSON格式的数据。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>fetch</title>
</head>
<body>
    <ul id = 'memberList'></ul>
    <script>
        const oUL =document.getElementById('memberList');
        fetch('https://api.github.com/orgs/lemoncode/members')
        .then(res=>res.json())
        .then(data => {
            //console.log(data)
            oUL.innerHTML = data.map(member => `
            <li>
                <img src="${member.avatar_url}" alt="">
                <span>${member.login}</span>
            </li>
            
            `).join('');
        })

    </script>
</body>
</html>

提示 : fetch默认采用异步模式,因此不会像XMLHttpRequest那样有阻塞问题。此外,需要注意的是,fetch不会自动拒绝非2xx状态码的响应;你需要手动检查response.ok或者response.status来确定请求是否成功。

3. 总结

虽然XMLHttpRequest仍然广泛存在于许多遗留项目中,但fetch因其简洁性和强大的特性成为了现代Web开发中的首选工具。如果你正在构建新的应用程序或模块,强烈建议使用fetch API来管理你的网络请求。同时,考虑到浏览器兼容性,确保你所针对的目标浏览器支持fetch,否则可能需要考虑使用polyfill。

如果觉得有帮助就点个赞再走吧,感谢支持