一篇文章搞懂AJAX、Fetch和Axios

什么是网络请求

我们在网上冲浪的时候,有没有想过那些文字照片视频是怎么传送到浏览器上的呢?其实这涉及到计算机网络相关的知识,我们的客户端和网站的服务器之间要进行很多的数据传输,也就是请求与响应。

客户端发送请求,服务器接收请求并作出响应;客户端处理响应的数据,呈现到页面上,就实现了页面的更新。

那么请求与响应是用什么技术实现的呢?这就是我们要讲的Ajax

AJAX

按照官方的定义,AJAX是一种网页开发技术,可以实现网页异步更新,不重新加载网页也能对网页进行部分更新。基于原生XHR开发,由XMLHttpRequest的API实现。相比于不使用AJAX的传统网页,AJAX可以局部刷新页面,当数据更新时无需重载整个页面。

具体的请求步骤如下,还是很繁琐的

js 复制代码
// 创建 XMLHttpRequest 对象
const xhr = new XMLHttpRequest();
// 规定请求类型、URL、是否异步;get请求的参数可以用?=&跟在url后面
xhr.open('GET', 'url', true);
// 发送信息至服务器时内容编码类型,get请求可以省略这一段
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
// 发送请求,参数是请求的具体信息,一般post请求需要设置
xhr.send()
// 监听服务器的通信状态,接收服务器响应数据
xhr.onreadystatechange = function () {
    if (xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) {
        cosnole.log(JSON.parse(xhr.responseText))
    }
}

Fetch

原生ajax操作实在是太麻烦了,于是官方推出了Fetch,它是一个底层API ,用来代替XHR,基于promise实现,因此也支持async和await。没有使用XMLHttpRequest对象。但是它不携带cookie,需要手动添加配置项。

它的实现方式如下

js 复制代码
fetch('url/get或post', {
    // 如果是post请求,需要设置请求头;get请求可以省略这一段
    method: 'POST',
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded'
    },
})
    .then(res => {
        if(res.ok) {
            return res.json();
        }
    })
    .then(data => {
        console.log(data);
    })

Axios

前面说了这么多,其实我们开发中最常用的还是Axios,它是基于promise封装的http库(而Fetch是js自带的api),可以用在浏览器和nodejs中。它本质是对原生XMLHttpRequest的封装,且支持Promise API,还可以拦截请求和响应,转换JSON数据。最重要的是很好写,可以说是十分方便了。

js 复制代码
// 展示一种较常见的写法
(async () => {
    // 创建axios实例,为请求设置统一的url和请求头等信息
    const http = axios.create({
        baseURL: 'uel',
        timeout: 10000, // 请求多久超时
        headers: {
            'Content-Type': 'application/json;charset=UTF-8'
        }
    })
    
    const res = await http.get('/get或post', {
        // 请求参数,get请求需要用params,post请求需要用data
        params: {
            id: 1,
            name: 'test'
        }
    })
})()

可以添加请求拦截器,在发送请求前进行一些操作,比如添加token;同时可以设置相应拦截器,在接收到响应后先做一层判断,比如状态码判断登录、授权

js 复制代码
    // 添加请求拦截器
    http.interceptors.request.use(
        config => {
        // 在发送请求之前做些什么
        console.log('发送了请求');
        return config;
        },
        error=> {
        // 对请求错误做些什么
        return Promise.reject(error);
        },
    );
  
    // 添加响应拦截器
    http.interceptors.response.use(
        res =>  {
        // 对响应数据做点什么
        // 对接口异常的数据需要给用户提示
        return response;
        },
        error => {
        // 对响应错误做点什么
        return Promise.reject(error);
        },
    );

如果是在nodejs中,还可以利用node环境变量判断区分开发测试生产环境

ini 复制代码
    if(process.env.NODE_ENV === 'development') {
        axios.defaults.baseURL = 'http://localhost:3000' // 开发环境下,请求地址改为本地地址
    } else if (process.env.NODE_ENV === 'production') {
        axios.defaults.baseURL = 'url' // 生产环境下,请求地址改为线上地址
    }

关于axios的更多用法请查阅文档吧!

相关推荐
_xaboy6 分钟前
开源 FormCreate 表单设计器配置组件的多语言
前端·vue.js·低代码·开源·可视化表单设计器
uglyduckling041215 分钟前
小程序构建NPM失败
前端·小程序·npm
草原上唱山歌17 分钟前
C/C++都有哪些开源的Web框架?
前端·c++·开源
烛阴20 分钟前
JavaScript 调度:setTimeout 和 setInterval
前端·javascript
月巴月巴白勺合鸟月半1 小时前
工作记录 2017-02-03
前端·c#·健康医疗
伟笑1 小时前
npm 报错 unable to resolve dependency tree
前端·npm·node.js
beibeibeiooo2 小时前
【ES6】04-对象 + 类 + 模板字符串 + 解构 + 字符串
前端·javascript·es6
冴羽2 小时前
SvelteKit 最新中文文档教程(6)—— 状态管理
前端·javascript·svelte
徐小黑ACG2 小时前
个人blog系统 前后端分离 前端js后端go
开发语言·前端·javascript·vue.js·golang
拉不动的猪3 小时前
刷刷题39(同一组件中的不同的标签页如何实现通信)
前端·javascript·面试