(1)AJAX即“AsynchronousJavascriptAndXML”(异步 JavaScript 和 XML),是指一种创建交互式网页应用的网页开发技术。它是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。通过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。传统的网页(不使用 Ajax)如果需要更新内容,必须重载整个网页页面。其缺点如下:
1,本身是针对MVC编程,不符合前端MVVM的浪潮
2,基于原生XHR开发,XHR本身的架构不清晰
3,不符合关注分离(Separation of Concerns)的原则
4,配置和调用方式非常混乱,而且基于事件的异步模型不友好。
(2)Fetch 号称是AJAX的替代品,是在ES6出现的,使用了ES6中的promise对象。Fetch是基于promise设计的。Fetch的代码结构比起ajax简单多。fetch不是ajax的进一步封装,而是原生js,没有使用XMLHttpRequest对象。
fetch的优点:
1,语法简洁,更加语义化
2,基于标准 Promise 实现,支持 async/await
3,更加底层,提供的API丰富(request, response)
4,脱离了XHR,是ES规范里新的实现方式
fetch的缺点:
1,fetch只对网络请求报错,对400,500都当做成功的请求,服务器返回 400,500 错误码时并不会 2,reject,只有网络错误这些导致请求不能完成时,fetch 才会被 reject。
3,fetch默认不会带cookie,需要添加配置项: fetch(url, {credentials: ‘include’})
4,fetch不支持abort,不支持超时控制,使用setTimeout及Promise.reject的实现的超时控制并不能阻止请求过程继续在后台运行,造成了流量的浪费
5,fetch没有办法原生监测请求的进度,而XHR可以
Fetch封装
npm install whatwg-fetch --save // 适配其他浏览器
npm install es6-promise
export const handleResponse = (response) => {
if (response.status === 403 || response.status === 401) {
const oauthurl = response.headers.get('locationUrl');
if (!_.isEmpty(oauthUrl)) {
window.location.href = oauthurl;
return;
}
}
if (!response.ok) {
return getErrorMessage(response).then(errorMessage => apiError(response.status, errorMessage));
}
if (isJson(response)) {
return response.json();
}
if (isText(response)) {
return response.text();
}
return response.blob();
};
const httpRequest = {
request: ({
method, headers, body, path, query,
}) => {
const options = {};
let url = path;
if (method) {
options.method = method;
}
if (headers) {
options.headers = {...options.headers,...headers};
}
if (body) {
options.body = body;
}
if (query) {
const params = Object.keys(query)
.map(k => `${k}=${query[k]}`)
.join('&');
url = url.concat(`?${params}`);
}
return fetch(url, Object.assign({}, options, { credentials: 'same-origin' })).then(handleResponse);
},
};
export default httpRequest;
(3)Axios 是一种基于Promise封装的HTTP客户端,其特点如下:
1,浏览器端发起XMLHttpRequests请求
2,node端发起http请求
3,支持Promise API
4,监听请求和返回
5,对请求和返回进行转化
6,取消请求
7,自动转换json数据
8,客户端支持抵御XSRF攻击