AJAX原理以及axios、fetch区别实例详解_AJAX相关

来源:脚本之家  责任编辑:小易  
目录
AJAX原理Promise封装AjaxJQ Ajax、Axios、Fetch的核心区别JQuery AjaxAxiosFetch补充:为什么要用axios?总结

AJAX原理

Ajax的原理简单来说是在用户和服务器之间加了—个中间层(AJAX引擎),通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,然后用javascript来操作DOM而更新页面。使用户操作与服务器响应异步化。Ajax的过程只涉及JavaScript、XMLHttpRequest和DOM。XMLHttpRequest是ajax的核心机制

XMLHttpRequest(XHR)对象用于与服务器交互。通过 XMLHttpRequest 可以在不刷新页面的情况下请求特定 URL,获取数据。这允许网页在不影响用户操作的情况下,更新页面的局部内容。XMLHttpRequest 可以用于获取任何类型的数据,而不仅仅是 XML。甚至支持 HTTP以外的协议(包括 file:// 和 FTP),尽管可能受到更多出于安全等原因的限制。

/** 1. 创建Ajax对象 **/
var xhr = window.XMLHttpRequest?new XMLHttpRequest():new ActiveXObject('Microsoft.XMLHTTP');// 兼容IE6及以下版本
/** 2. 配置 Ajax请求 **/
xhr.open('get', url, true)
/** 3. 发送请求 **/
xhr.send(null); // 严谨写法
/** 4. 监听请求,接受响应 **/
xhr.onreadystatechange = function(){
    if(xhr.readyState == 4){
        if(xhr.status == 200){
            success(xhr.responseText);
        } else { 
            /** false **/
            fail && fail(xhr.status);
        }
    }
}

onreadystatechange:当 readyState 属性发生变化时,调用的事件处理函数

readyState:

状态描述
0UNSENT代理被创建,但尚未调用 open() 方法。
1OPENEDopen() 方法已经被调用。
2HEADERS_RECEIVEDsend() 方法已经被调用,并且头部和状态已经可获得。
3LOADING下载中; responseText 属性已经包含部分数据。
4DONE下载操作已完成。

response:返回的包含整个响应实体

responseText:返回一个DOMString,该 DOMString 包含对请求的响应,如果请求未成功或尚未发送,则返回 null。

responseType:一个用于定义响应类型的枚举值(enumerated value)。

类型解释
“ ”空的 responseType 字符串与默认类型 "text" 相同。
"arraybuffer"response 是一个包含二进制数据的 JavaScript ArrayBuffer
"blob"response 是一个包含二进制数据的 Blob 对象。
"document"response 是一个 HTMLDocument或XMLDocument
"json"response是通过将接收到的数据内容解析为JSON的JS对象
"text"response 是 DOMString 对象中的文本。
"ms-stream"response是流式下载的一部分;此响应类型仅允许用于下载请求,并且仅受 Internet Explorer 支持。

status:返回一个无符号短整型(unsigned short)数字,代表请求的响应状态。

var xhr = new XMLHttpRequest();
console.log('UNSENT', xhr.status);

xhr.open('GET', '/server', true);
console.log('OPENED', xhr.status);

xhr.onprogress = function () {
  console.log('LOADING', xhr.status);
};

xhr.onload = function () {
  console.log('DONE', xhr.status);
};

xhr.send(null);

/**
 * 输出如下:
 *
 * UNSENT(未发送) 0
 * OPENED(已打开) 0
 * LOADING(载入中) 200
 * DONE(完成) 200
 */

withCredentials:一个布尔值,用来指定跨域 Access-Control 请求是否应当带有授权信息,如 cookie 或授权 header 头。xhr.withCredentials=true

upload:代表上传进度

其他更多XMLHttpRequest相关api

ajax 有那些优缺点?

优点:

通过异步模式,提升了用户体验.优化了浏览器和服务器之间的传输,减少不必要的数据往返,减少了带宽占用.Ajax在客户端运行,承担了一部分本来由服务器承担的工作,减少了大用户量下的服务器负载。Ajax可以实现动态不刷新(局部刷新)

缺点:

安全问题 AJAX暴露了与服务器交互的细节。对搜索引擎的支持比较弱。不容易调试。

Promise封装Ajax

promise 封装实现:

// promise 封装实现:
function getJSON(url) {
  // 创建一个 promise 对象
  let promise = new Promise(function(resolve, reject) {
    let xhr = new XMLHttpRequest();

    // 新建一个 http 请求
    xhr.open("GET", url, true);

    // 设置状态的监听函数
    xhr.onreadystatechange = function() {
      if (this.readyState !== 4) return;

      // 当请求成功或失败时,改变 promise 的状态
      if (this.status === 200) {
        resolve(this.response);
      } else {
        reject(new Error(this.statusText));
      }
    };

    // 设置错误监听函数
    xhr.onerror = function() {
      reject(new Error(this.statusText));
    };

    // 设置响应的数据类型
    xhr.responseType = "json";

    // 设置请求头信息
    xhr.setRequestHeader("Accept", "application/json");

    // 发送 http 请求
    xhr.send(null);
  });
  return promise;
}

JQ Ajax、Axios、Fetch的核心区别

JQuery Ajax

Ajax前后端数据通信「同源、跨域」

// 用户登录 -> 登录成功 -> 获取用户信息
/* 回调地狱 */
$.ajax({
    url: 'http://127.0.0.1:8888/user/login',
    method: 'post',
    data: Qs.stringify({
        account: '18310612838',
        password: md5('1234567890')
    }),
    success(result) {
        if (result.code === 0) {
            // 登录成功
            $.ajax({
                url: 'http://127.0.0.1:8888/user/list',
                method: 'get',
                success(result) {
                    console.log(result);
                }
            });
        }
    }
});

优缺点:

本身是针对MVC的编程,不符合现在前端MVVM的浪潮基于原生的XHR开发,XHR本身的架构不清晰,已经有了fetch的替代方案JQuery整个项目太大,单纯使用ajax却要引入整个JQuery非常的不合理(采取个性化打包的方案又不能享受CDN服务)

Axios

Axios也是对ajax的封装,基于Promise管理请求,解决回调地狱问题

axios({
    method: 'post',
    url: '/user/login',
    data: {
        username: 'name',
        password: 'password'
    }
})
.then(function (response) {
    console.log(response);
})
.catch(function (error) {
    console.log(error);
});
// 或使用 async await
(async function () {
    let result1 = await axios.post('/user/login', {
        username: 'name',
        password: 'password'
    });
    let result2 = await axios.get('/user/list');
    console.log(result1, result2);
})(); 

优缺点:

从浏览器中创建 XMLHttpRequest从 node.js 发出 http 请求支持 Promise API拦截请求和响应转换请求和响应数据取消请求自动转换JSON数据客户端支持防止CSRF/XSRF

Fetch

Fetch是ES6新增的通信方法,不是ajax,但是他本身实现数据通信,就是基于promise管理的

try {
  let response = await fetch(url, options);
  let data = response.json();
  console.log(data);
} catch(e) {
  console.log("Oops, error", e);
}

示例:

(async function () {
    let result = await fetch('http://127.0.0.1:8888/user/login', {
        method: 'post',
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded'
        },
        body: Qs.stringify({
            name: 'name',
            password: 'password'
        })
    })
    let data = result.json();
    console.log(data)
?
    let result2 = await fetch('http://127.0.0.1:8888/user/list').then(response => {
        return response.json();
    });
    console.log(result2);
})(); 

优缺点:

fetcht只对网络请求报错,对400,500都当做成功的请求,需要封装去处理fetch默认不会带cookie,需要添加配置项fetch不支持abort,不支持超时控制,使用setTimeout及Promise.reject的实现的超时控制并不能阻止请求过程继续在后台运行,造成了量的浪费fetch没有办法原生监测请求的进度,而XHR可以

补充:为什么要用axios?

axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端,它本身具有以下特征:

从浏览器中创建 XMLHttpRequest从 node.js 发出 http 请求支持 Promise API拦截请求和响应转换请求和响应数据取消请求自动转换JSON数据客户端支持防止CSRF/XSRFaxios既提供了并发的封装,也没有fetch的各种问题,而且体积也较小,当之无愧现在最应该选用的请求的方式。

三选一绝必是axios了。其流程图如下:

总结

到此这篇关于AJAX原理以及axios、fetch区别的文章就介绍到这了,更多相关AJAX原理 axios、fetch区别内容请搜索真格学网以前的文章或继续浏览下面的相关文章希望大家以后多多支持真格学网!

您可能感兴趣的文章:聊一聊数据请求中Ajax、Fetch及Axios的区别

  • 本文相关:
  • ajax编写简单的登录页面
  • 细数ajax请求中的async:false和async:true的差异
  • ajax接收date类型的数据时会把数据转换为时间戳
  • 使用ajax实现进度条的绘制
  • ajax上传多图到php服务器的方法
  • jquery中$.ajax()方法参数详解
  • ajax 技术和原理分析
  • springmvc环境下实现的ajax异步请求json格式数据
  • ajax 通过城市名获取数据(全国天气预报api)
  • 浅谈ajax相关及其优缺点
  • axios和ajax区别
  • ajax和axios请求有什么不一样
  • 为什么传进去一个object,axios会在ajax请求中转化成form data
  • vue axios封装及API统一管理的方法
  • axios 处理 302 状态码的解决方法
  • vue中Axios的封装与API接口的管理详解
  • vue.js 怎么引入axios
  • 基于vue 添加axios组件,解决post传参数为null的问题
  • vue添加axios,并且指定baseurl的方法
  • vue+axios新手实践实现登陆的示例代码
  • 用Axios Element实现全局的请求loading的方法
  • vue.js 使用axios实现下载功能的示例
  • 在vue组件中使用axios的方法
  • axios post提交formdata的实例
  • vue框架搭建之axios使用教程
  • vue 2.x 中axios 封装的get 和post方法
  • 解决vue2中使用axios http请求出现的问题
  • vue使用axios上传文件(FormData)的方法
  • axios和fetch哪个更好?
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全javascriptasp.netphp编程ajax相关正则表达式asp编程jsp编程编程10000问css/htmlflex脚本加解密web2.0xml/rss网页编辑器相关技巧安全相关网页播放器其它综合dart首页ajax相关聊一聊数据请求中ajax、fetch及axios的区别ajax编写简单的登录页面细数ajax请求中的async:false和async:true的差异ajax接收date类型的数据时会把数据转换为时间戳使用ajax实现进度条的绘制ajax上传多图到php服务器的方法jquery中$.ajax()方法参数详解ajax 技术和原理分析springmvc环境下实现的ajax异步请求json格式数据ajax 通过城市名获取数据(全国天气预报api)浅谈ajax相关及其优缺点jquery ajax 向后台传递数组参数示例ajax readystate的五种状态详解jquery实现ajax定时刷新局部页面实例ajax中的async属性值之同步和异步及同步和异步区别ajax传递多个参数具体实现ajax获取数据然后显示在页面的实现方法ajax获取数据中文乱码问题最简单的完美解决方案jquery ajax中使用serialize()方法提交表ajax请求二进制流进行处理(ajax异步下载文件)的简单方自己动手打造ajax图片上传(网上没有的)详解ajax跨域(jsonp) 调用java后台自己动手封装的 ajaxjavascript ajax 类实现代码ajax叠加(ajax返回数据用ajax发出)示例代码ajax打开新窗口被浏览器拦截的两种解决办法jquery ajax 返回json时出现中文乱码该如何解决select2在使用ajax获取远程数据时显示默认数据的方法ajax异步方式实现登录与验证ajax请求二进制流进行处理(ajax异步下载文件)的简单方法servlet 与 ajax 交互一直报status=parsererror
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved