http request-01-XMLHttpRequest X

2024-08-16  本文已影响0人  老马啸西风2020

http 请求系列

http request-01-XMLHttpRequest XHR 简单介绍

http request-01-XMLHttpRequest XHR 标准

Ajax 详解-01-AJAX(Asynchronous JavaScript and XML)入门介绍

Ajax XHR 的替代方案-fetch

Ajax XHR 的替代方案-fetch 标准

Ajax 的替代方案-axios.js

http 请求-04-promise 对象 + async/await

XHR 的官方学习资料 给出网址

以下是一些官方学习 XMLHttpRequest (XHR) 的资源网址:

  1. MDN Web Docs - XMLHttpRequest

    • MDN XMLHttpRequest Documentation
    • 这是最权威和详细的 XHR 文档,提供了关于如何使用 XMLHttpRequest 的全面介绍,包括属性、方法、事件和示例代码。
  2. WhatWG - XMLHttpRequest Standard

    • WhatWG XMLHttpRequest Standard
    • WhatWG 的标准文档详细描述了 XMLHttpRequest 的规范和实现细节,是了解其正式标准的良好资源。
  3. W3C - XMLHttpRequest Level 2 Specification

    • W3C XMLHttpRequest Level 2
    • W3C 的规范文档提供了 XMLHttpRequest Level 2 的详细描述,包括新增的功能和改进。

这些资源将帮助你深入理解 XMLHttpRequest 的功能、用法和规范。

XHR 是什么?

XMLHttpRequest(XHR)是一个用于在客户端和服务器之间进行异步 HTTP 请求的 API,广泛用于动态更新网页内容,而无需重新加载整个页面。

尽管它最初是为了处理 XML 数据而设计的,但它现在支持多种数据格式,并已成为 Web 开发中重要的工具。

1. 基本概念

XMLHttpRequest 提供了在客户端(如浏览器)与服务器之间进行异步通信的能力,使得网页可以在不重新加载页面的情况下更新内容。

它的主要用途包括动态加载数据、提交表单以及与服务器进行实时交互。

2. 核心方法和属性

2.1 创建请求

const xhr = new XMLHttpRequest();

2.2 配置请求

xhr.open('GET', 'https://example.com/data', true);

2.3 发送请求

xhr.send();

2.4 事件处理

xhr.onload = function() {
  if (xhr.status >= 200 && xhr.status < 300) {
    console.log(xhr.responseText);
  } else {
    console.error('Request failed with status:', xhr.status);
  }
};

xhr.onerror = function() {
  console.error('Request error');
};

2.5 重要属性

3. 使用示例

3.1 简单 GET 请求

const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://jsonplaceholder.typicode.com/posts/1', true);
xhr.onload = function() {
  if (xhr.status === 200) {
    console.log('Response:', xhr.responseText);
  } else {
    console.error('Error:', xhr.status, xhr.statusText);
  }
};
xhr.send();

3.2 POST 请求

const xhr = new XMLHttpRequest();
xhr.open('POST', 'https://jsonplaceholder.typicode.com/posts', true);
xhr.setRequestHeader('Content-Type', 'application/json;charset=UTF-8');
xhr.onload = function() {
  if (xhr.status === 201) {
    console.log('Created:', xhr.responseText);
  } else {
    console.error('Error:', xhr.status, xhr.statusText);
  }
};
const data = JSON.stringify({ title: 'foo', body: 'bar', userId: 1 });
xhr.send(data);

3.3 进度监控

const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://jsonplaceholder.typicode.com/posts/1', true);
xhr.onprogress = function(event) {
  if (event.lengthComputable) {
    const percentComplete = (event.loaded / event.total) * 100;
    console.log('Progress:', percentComplete.toFixed(2) + '%');
  }
};
xhr.onload = function() {
  if (xhr.status === 200) {
    console.log('Response:', xhr.responseText);
  } else {
    console.error('Error:', xhr.status, xhr.statusText);
  }
};
xhr.send();

4. 优缺点

4.1 优点

4.2 缺点

5. 现代替代

XMLHttpRequest 的一些功能和用途已经被更现代的 fetch API 所取代。fetch 提供了更简洁的语法、支持 Promise 和流处理,使得异步操作和错误处理更为直观。

XHR 为什么需要?解决了什么问题

XMLHttpRequest (XHR) 是一种用于在浏览器和服务器之间进行异步通信的 API。它在 Web 开发中解决了多个关键问题,特别是在用户体验和动态网页更新方面。

以下是 XMLHttpRequest 需要的原因及其解决的问题:

1. 页面异步更新

问题

解决方案

2. 提高用户体验

问题

解决方案

3. 动态内容加载

问题

解决方案

4. 后台数据处理

问题

解决方案

5. 局部更新和请求管理

问题

解决方案

6. 进度监控

问题

解决方案

7. 与其他技术的兼容性

问题

解决方案

XHR 的适用场景,优缺点

XMLHttpRequest(XHR)在 Web 开发中有一些特定的适用场景,以及它的优点和缺点。

以下是一些实际应用场景和它们的优缺点,用更接地气的方式来解释:

适用场景

  1. 动态内容更新

    • 场景: 当你希望在用户与网页交互时,动态更新页面的一部分内容,例如加载评论、文章或产品列表,而不需要重新加载整个页面。
    • 例子: 社交媒体平台上的帖子加载,电商网站上的产品筛选。
  2. 异步表单提交

    • 场景: 当用户填写表单并提交数据时,你希望在后台处理这些数据,而不刷新整个页面。
    • 例子: 用户在评论框中输入内容并提交,数据直接上传到服务器,页面不会重载。
  3. 局部数据刷新

    • 场景: 需要刷新网页的某个部分的数据,而不是整个页面。例如,实时更新价格或天气信息。
    • 例子: 监控仪表板上更新服务器状态,新闻网站上实时更新新闻头条。
  4. 进度反馈

    • 场景: 需要监控和展示文件上传或下载的进度,让用户知道操作的进展。
    • 例子: 文件上传表单,下载大文件时显示进度条。
  5. 旧版浏览器兼容

    • 场景: 如果你的应用需要支持旧版浏览器,它可能不支持现代的 fetch API,但支持 XMLHttpRequest
    • 例子: 针对使用老旧设备或浏览器的用户群体的应用。

优点

  1. 广泛支持

    • 优点: 几乎所有的浏览器都支持 XMLHttpRequest,包括许多旧版浏览器。
    • 实际感受: 你不需要担心用户的浏览器是否支持,因为它几乎能在所有环境中工作。
  2. 灵活性

    • 优点: 支持多种 HTTP 方法(GET、POST、PUT、DELETE 等),并且能够处理不同格式的响应数据。
    • 实际感受: 可以用来做各种各样的请求,比如从服务器获取 JSON 数据或发送表单数据。
  3. 进度监控

    • 优点: 提供 onprogress 事件,可以监控请求的进度。
    • 实际感受: 你可以给用户提供下载或上传的实时进度,提升用户体验。

缺点

  1. 复杂性

    • 缺点: 处理异步请求和响应可能会很复杂,尤其是在嵌套回调函数(“回调地狱”)的情况下。
    • 实际感受: 编写代码时可能会变得混乱,不容易维护。
  2. 没有内建的 Promise 支持

    • 缺点: 不像 fetch API,XMLHttpRequest 默认不支持 Promise,处理异步操作时需要使用回调函数。
    • 实际感受: 需要额外的工作来处理异步操作,代码可能不够简洁。
  3. 较少的功能扩展

    • 缺点: 与现代 API 比如 fetch 相比,XMLHttpRequest 在流处理和功能扩展方面有所限制。
    • 实际感受: 如果需要更高级的功能,比如流式处理大文件,XMLHttpRequest 可能无法满足需求。

XHR 的使用最佳实践

使用 XMLHttpRequest (XHR) 时,遵循一些最佳实践可以帮助你写出更高效、可靠和可维护的代码。以下是一些实际的最佳实践:

1. 使用异步请求

const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://example.com/data', true);
xhr.send();

2. 处理请求状态变化

const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://example.com/data', true);
xhr.onreadystatechange = function() {
  if (xhr.readyState === 4) { // DONE
    if (xhr.status === 200) {
      console.log('Response:', xhr.responseText);
    } else {
      console.error('Error:', xhr.status, xhr.statusText);
    }
  }
};
xhr.send();

3. 设置适当的请求头

const xhr = new XMLHttpRequest();
xhr.open('POST', 'https://example.com/data', true);
xhr.setRequestHeader('Content-Type', 'application/json;charset=UTF-8');
const data = JSON.stringify({ key: 'value' });
xhr.send(data);

4. 处理错误和超时

const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://example.com/data', true);
xhr.timeout = 5000; // 设置超时时间为 5000 毫秒

xhr.ontimeout = function() {
  console.error('Request timed out');
};

xhr.onerror = function() {
  console.error('Request error');
};

xhr.onload = function() {
  if (xhr.status === 200) {
    console.log('Response:', xhr.responseText);
  }
};

xhr.send();

5. 监控进度

const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://example.com/largefile', true);
xhr.onprogress = function(event) {
  if (event.lengthComputable) {
    const percentComplete = (event.loaded / event.total) * 100;
    console.log('Progress:', percentComplete.toFixed(2) + '%');
  }
};
xhr.onload = function() {
  if (xhr.status === 200) {
    console.log('File downloaded successfully');
  }
};
xhr.send();

6. 避免回调地狱

function fetchData(url) {
  return new Promise((resolve, reject) => {
    const xhr = new XMLHttpRequest();
    xhr.open('GET', url, true);
    xhr.onload = function() {
      if (xhr.status === 200) {
        resolve(xhr.responseText);
      } else {
        reject(new Error(`Request failed with status ${xhr.status}`));
      }
    };
    xhr.onerror = function() {
      reject(new Error('Network error'));
    };
    xhr.send();
  });
}

// 使用
fetchData('https://example.com/data')
  .then(response => console.log('Response:', response))
  .catch(error => console.error('Error:', error));

7. 处理不同数据格式

const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://example.com/data', true);
xhr.onload = function() {
  if (xhr.status === 200) {
    const contentType = xhr.getResponseHeader('Content-Type');
    if (contentType.includes('application/json')) {
      const data = JSON.parse(xhr.responseText);
      console.log('JSON data:', data);
    } else {
      console.log('Response:', xhr.responseText);
    }
  }
};
xhr.send();

8. 保持代码简洁

function createRequest(method, url, callback) {
  const xhr = new XMLHttpRequest();
  xhr.open(method, url, true);
  xhr.onload = function() {
    if (xhr.status >= 200 && xhr.status < 300) {
      callback(null, xhr.responseText);
    } else {
      callback(new Error(`Request failed with status ${xhr.status}`));
    }
  };
  xhr.onerror = function() {
    callback(new Error('Network error'));
  };
  xhr.send();
}

// 使用
createRequest('GET', 'https://example.com/data', (error, response) => {
  if (error) {
    console.error('Error:', error);
  } else {
    console.log('Response:', response);
  }
});

总结

遵循这些最佳实践可以帮助你在使用 XMLHttpRequest 时编写更高效、可靠和易于维护的代码。

虽然 fetch API 提供了更现代的接口,但了解和掌握 XMLHttpRequest 仍然在许多情况下很重要,尤其是在处理兼容性问题时。

上一篇 下一篇

猜你喜欢

热点阅读