http request-01-XMLHttpRequest XHR 简单介绍
http request-01-XMLHttpRequest XHR 标准
Ajax 详解-01-AJAX(Asynchronous JavaScript and XML)入门介绍
http 请求-04-promise 对象 + async/await
以下是一些官方学习 XMLHttpRequest
(XHR) 的资源网址:
MDN Web Docs - XMLHttpRequest
XMLHttpRequest
的全面介绍,包括属性、方法、事件和示例代码。WhatWG - XMLHttpRequest Standard
XMLHttpRequest
的规范和实现细节,是了解其正式标准的良好资源。W3C - XMLHttpRequest Level 2 Specification
XMLHttpRequest
Level 2 的详细描述,包括新增的功能和改进。这些资源将帮助你深入理解 XMLHttpRequest
的功能、用法和规范。
XMLHttpRequest
(XHR)是一个用于在客户端和服务器之间进行异步 HTTP 请求的 API,广泛用于动态更新网页内容,而无需重新加载整个页面。
尽管它最初是为了处理 XML 数据而设计的,但它现在支持多种数据格式,并已成为 Web 开发中重要的工具。
XMLHttpRequest
提供了在客户端(如浏览器)与服务器之间进行异步通信的能力,使得网页可以在不重新加载页面的情况下更新内容。
它的主要用途包括动态加载数据、提交表单以及与服务器进行实时交互。
const xhr = new XMLHttpRequest();
method
: HTTP 方法(如 GET
、POST
)。url
: 请求的 URL。async
: 是否异步(true
或 false
)。user
和 password
: 可选的身份验证信息。xhr.open('GET', 'https://example.com/data', true);
body
参数用于发送数据(对于 GET
请求,通常为空)。xhr.send();
xhr.onload = function() {
if (xhr.status >= 200 && xhr.status
Content-Type
是 application/xml
或 text/xml
)。ArrayBuffer
、Blob
)返回的响应数据。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();
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);
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();
fetch
API 提供了更简洁的语法和更强大的功能,例如流处理和更好的错误处理。XMLHttpRequest
的一些功能和用途已经被更现代的 fetch
API 所取代。fetch
提供了更简洁的语法、支持 Promise 和流处理,使得异步操作和错误处理更为直观。
XMLHttpRequest
(XHR) 是一种用于在浏览器和服务器之间进行异步通信的 API。它在 Web 开发中解决了多个关键问题,特别是在用户体验和动态网页更新方面。
以下是 XMLHttpRequest
需要的原因及其解决的问题:
XMLHttpRequest
通过异步处理请求,允许浏览器在发出请求时继续执行其他操作,不会阻塞用户界面的交互。这样,用户可以继续与网页进行交互,而不会受到请求等待的影响。XMLHttpRequest
,网页可以在运行时动态加载数据,并根据需要更新内容。比如,用户滚动到页面底部时自动加载更多数据(如无限滚动),或者基于用户输入实时更新搜索结果。XMLHttpRequest
可以在不刷新页面的情况下提交表单数据。这使得用户可以在不离开当前页面的情况下完成数据提交和处理。XMLHttpRequest
允许通过指定的 URL 和请求方法,只更新页面的某一部分内容。这简化了局部更新的实现,并减少了对服务器的负担。XMLHttpRequest
提供了 onprogress
事件,使得开发者可以实时监控请求的进度,并向用户提供反馈,例如显示下载进度条。fetch
API 出现之前,许多旧版浏览器不支持现代的 HTTP 请求 API。XMLHttpRequest
作为较早的标准,得到了广泛的浏览器支持,包括旧版浏览器。这使得它在需要兼容旧版浏览器的应用中仍然非常重要。XMLHttpRequest
(XHR)在 Web 开发中有一些特定的适用场景,以及它的优点和缺点。
以下是一些实际应用场景和它们的优缺点,用更接地气的方式来解释:
动态内容更新
异步表单提交
局部数据刷新
进度反馈
旧版浏览器兼容
fetch
API,但支持 XMLHttpRequest
。广泛支持
XMLHttpRequest
,包括许多旧版浏览器。灵活性
进度监控
onprogress
事件,可以监控请求的进度。复杂性
没有内建的 Promise 支持
fetch
API,XMLHttpRequest
默认不支持 Promise,处理异步操作时需要使用回调函数。较少的功能扩展
fetch
相比,XMLHttpRequest
在流处理和功能扩展方面有所限制。XMLHttpRequest
可能无法满足需求。使用 XMLHttpRequest
(XHR) 时,遵循一些最佳实践可以帮助你写出更高效、可靠和可维护的代码。以下是一些实际的最佳实践:
XMLHttpRequest
的 async
参数设置为 true
,以便异步处理请求。const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://example.com/data', true);
xhr.send();
onreadystatechange
事件来处理请求的不同状态。确保检查 readyState
和 status
属性来确定请求是否成功完成。readyState
提供了请求的当前状态,status
表示 HTTP 响应状态码,帮助你正确处理响应或错误。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();
Content-Type
)。如果你发送 JSON 数据,确保设置 Content-Type
为 application/json
。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);
onerror
事件处理网络错误,使用 ontimeout
处理超时情况。设置超时时间以防止请求挂起过久。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();
onprogress
事件来监控请求的进度,尤其是处理大文件上传或下载时。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();
Promises
(如果需要兼容性,可以用 Promise
封装 XHR)。虽然 XHR 本身不支持 Promise
,但你可以创建自己的封装。Promise
可以提高代码的可读性和可维护性。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));
Content-Type
处理数据。例如,如果响应是 JSON 格式,则调用 responseText
并使用 JSON.parse
解析。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();
function createRequest(method, url, callback) {
const xhr = new XMLHttpRequest();
xhr.open(method, url, true);
xhr.onload = function() {
if (xhr.status >= 200 && xhr.status {
if (error) {
console.error('Error:', error);
} else {
console.log('Response:', response);
}
});
遵循这些最佳实践可以帮助你在使用 XMLHttpRequest
时编写更高效、可靠和易于维护的代码。
虽然 fetch
API 提供了更现代的接口,但了解和掌握 XMLHttpRequest
仍然在许多情况下很重要,尤其是在处理兼容性问题时。
参与评论
手机查看
返回顶部