关于 axios 是什么?以及怎么用?

关于,axios,什么,以及,怎么 · 浏览次数 : 396

小编点评

## axios全部分代码解析 **1. 请求配置** ```javascript const instance = axios.create({ baseURL: 'https://api.example.com', timeout: 1000, }); ``` * 创建一个实例,指定baseURL、timeout * 使用axios创建实例 **2. 请求拦截器** ```javascript instance.interceptors.request.use(config => { config.headers.token = AUTH_TOKEN; return config; }, err => { return Promise.reject(err); }); ``` * 请求拦截器,设置token,并在请求中添加token * 异常拦截,返回错误 **3.响应拦截器** ```javascript instance.interceptors.response.use(res => { return res; }, err => { return Promise.reject(err); }); ``` *响应拦截器,返回响应 * 异常拦截,返回错误 **4.错误处理** ```javascript instance.interceptors.request.use(config => { return config; }, err => { return Promise.reject(err); }); ``` * 请求拦截器,异常处理 * 所有错误处理都会进入catch中 **5.全局错误处理** ```javascript axios.defaults.timeout = 1000; axios.defaults.baseURL = 'https://api.example.com'; ``` * 设置全局默认timeout和baseURL **6.实例配置** ```javascript const instance = axios.create({ baseURL: 'https://api.example.com', timeout: 1000, }); ``` * 创建一个实例,指定baseURL、timeout **7.其他方法** * 获取实例:`instance.get('/data')` * 设置默认配置:`instance.defaults.headers.common['Authorization'] = AUTH_TOKEN` **总结** 以上代码展示了axios全部分代码解析,包括请求配置、请求拦截器、响应拦截器、错误处理以及全局错误处理等。

正文

〇、前言

Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 Node.js 中。简单的讲就是可以发送 Get、Post 请求。

诸如 Vue、React、Angular 等前端框架都可以使用 Axios,由于他们不操作 DOM,所以就不必须引用 jQuery。如果你的项目里面用了 jQuery,此时就不需要多此一举了,jQuery 里面本身就可以发送请求($.get(URL,data,function(data,status,xhr),dataType))。

几个易混淆的概念

  1. Ajax:Asynchronous JavaScript And XML,翻译过来就是“异步的 Javascript 和 XML”,属于一个术语或概念模型,并不特指某一技术,它很重要的特性之一就是让页面实现局部刷新,而无需重载整个页面
  2. XHR:XMLHttpRequest 对象用于与服务器交互。通过 XMLHttpRequest 可以在不刷新页面的情况下请求特定 URL,取的数据后刷新局部页面。因此,XHR 可以实现 Ajax 请求
  3. Promise:是 ES6 新增的一个对象,是对 XHR 的一种封装
    它就像一个容器,里面存放着未来才会执行的函数名,处理结果要在异步操作完成后拿到,然后通过 .then() 进行后续操作。
    它有三种状态:Pending(进行中)、Fulfilled(成功)、Rejected(拒绝),进入成功或拒绝的状态就不会再发生改变。
  4. Fetch:是在 ES6 出现的,它使用了 ES6 提出的 Promise 对象。是一种网络请求标准 API。
  5. Axios:用于网络请求的第三方库,引用后即可用。
    使用环境有两种,一种是在浏览器端发送 XHR 请求(中间有一层 Promise 封装),另一种是在 nodejs 中发送 http 请求,因此利于平台切换。
    支持 Promise API,使用 Promise 管理异步,告别传统 Callback 方式;丰富的配置项,支持拦截器等高级配置。

注:一两句话不可能讲清楚他们的区别,待后续再慢慢一一展开介绍吧,如有不准确的描述,请评论区指正。

参考:你知道Ajax、Fetch、Axios三者的区别吗?    ajax、Promise、axios总结

一、如何引用?

1、前端项目

// 1、安装 Axios 库
// 在项目文件根目录下打开命令行,输入如下语句
> npm install axios

// 2、js 文件中引入
import axios from 'axios';

// 3、直接通过关键字 axios 发送 http 请求
// Get 请求
axios({
  method: 'get',
  url: 'URL文本'
}).then(({data}) => {
  // 。。。
}).catch((err) =>{
    console.log("catch-err:",err);
}).finally(() =>{
  // 。。。
})

// Post 请求
axios({
  headers:{'content-type':'application/json'},
  method: 'post',
  url: 'URL文本',
  data:JSON.stringify({"dataid":dataid})
}).then(({data}) => {
  console.log("then-data:",data);
}).catch((err) =>{
    console.log("catch-err:",err);
}).finally(() =>{
  // 。。。
})

2、ASP.NET Core MVC 项目

@* 1、引用 js 包的 CDN *@
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

@* 2、通过关键字 axios 发送 http 请求 *@
<script>
    // 调用方法 message() 查看测试结果
    window.onload = function () {
        // Get 请求
        axios.get('https://localhost:44360/api/Methodname', {
            params: {
                mingcheng: '网络科技'
            },
            headers: {
                    'token': '1111',
            }
        }
        ).then(ret => {
            console.log("get:", ret);
        })
        // Post 请求
        axios.post('https://localhost:44360/api/Methodname',
            {
                "id": "df332b50-4abf-4fe6-814b-6d330a9ecc73",
                "gongsix": "线下"
            },
            {
                headers: {
                    'token': '1111',
                }
            }
        ).then(ret => {
            console.log("post:", ret);
        })
    }
</script>

另外,除了通过 CDN 引用 js 库外,还可以直接添加 js 文件到项目的静态文件夹 wwwroot,然后在 .cshtml 页面文件中用过路径引用。

简要的三个步骤如下:

  1. 下载 js 库文件。可以直接在网络上下载,也可以通过通过项目的“管理 NuGet 程序包”来安装 axios。安装成功后,找到对应的包右键打开“在文件资源管理器中打开文件夹”,按照路径“Content/Scripts/axios.min.js”找到下载的最新文件。
  2. 然后复制到“wwwroot/js/...”文件夹下备用。如下图:

    

  3. 然后通过路径引用后,即可在 js 脚本中使用 axios。

@* 注意路径代表 wwwroot 文件夹中,要对应得上 *@
<script src="~/js/axios/axios.min.js"></script>

二、语法

参数名 示例值 解释
url '/user' 用于请求的服务器 URL
method 'get' 创建请求时使用的方法,默认 get
baseURL 'https://some-domain.com/api/' 将自动加在 `url` 前面,除非 `url` 是一个绝对 URL(URL 必须带有资源的完整信息,包含协议、主机、路径等部分)
headers {'X-Requested-With': 'XMLHttpRequest'} 自定义请求头
params { ID: 12345 } URL 参数,会自动拼接到 URL 中
data { firstName: 'Fred' } 作为请求主体被发送的数据,适用于'PUT'、'POST'、'PATCH' 三个请求方法。在没有设置 transformRequest 时,必须是以下类型之一:string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams、浏览器专属:FormData, File, Blob、Nodejs专属:Stream
timeout 1000 请求超时的毫秒数(0 表示无超时时间),若超时请求将被中断
withCredentials false 跨域请求时是否需要使用凭证,默认 false
responseType 'json' 服务器响应的数据类型,可以是 'arraybuffer', 'blob', 'document', 'json'-默认, 'text', 'stream'
responseEncoding 'utf8' 数据编码类型,默认 utf8
maxContentLength 2000 允许的响应内容的最大长度,设置为无限长度:Infinity

1、Get 请求

以下列举三种写法:

// (调用型1)查询给定 ID 的 user 对象请求
axios.get('/user?ID=12345')
.then(function (response) {
    console.log(response);
})
.catch(function (error) {
    console.log(error);
});

// (调用型2)另一种写法
axios.get('/user', {
    params: {
        ID: 12345
    }
})
.then(function (response) {
    console.log(response);
})
.catch(function (error) {
    console.log(error);
});

// (方法型)写法
axios({
  method:'get',
  url:'/data.json',
  params:{
    id:'12345'
  }
}).then((res)=>{
     console.log(res)
})

2、Post 请求

 一般上传的数据分两种:form-data 表单提交(图片上传、文件上传)、application/json。

// 先定义一个入参 data
let data = { id : 12 }

// (调用型)写法
axios.post('/post',data)
}).then((res)=>{
     console.log(res)
})

// (方法型)写法
axios({
  method:'post',
  url:'/post',
  data:data
}).then((res)=>{
     console.log(res)
})

关于 Post 请求的 Content-Type:

当我们直接把入参填入 json 对象,丢给后端接口,此时 Content-Type 就自动为:application/json;charset=UTF-8。

当我们把 json 对象转为 FormData 类型,如下:

let data = { id : 12 }
let formData = new FormData()
for(let key in data){
    formData.append(key,data[key])
}

再将 formData 发送到后端,此时Content-Type 就自动变成:multipart/form-data; boundary=...... 。

3、判断多个请求全部完成 axios.all(sendAry).then()

// 请求列表,包含多个或多类型请求
let sendAry = [
    axios.get('URL1'),
    axios.get('URL2'),
    axios.post('URL3')
];
// 列表中的请求都完成后,才进行后续操作(可以基于ALL实现)
axios.all(sendAry).then(result => {
    console.log(result); // 输出是一个数组,分别存储每一个请求的结果
    let [resA, resB, resC] = result;
});

4、拦截器

在请求或响应被 then 或 catch 处理前拦截它们。

请求拦截器

axios.interceptors.request.use(
    config=>{
        // 在发送请求前做的操作
        return config
  },
    err=>{
        // 在请求错误的时候做的操作(此处错误,请求没有到后端)
        return Promise.reject(err) // 这里返回一个 promise 对象
  }
)

响应拦截器

axios.interceptors.response.use(
	res=>{
		// 请求成功对响应数据进行处理
		return res
	},err=>{
		// 响应错误做的操作(此处错误,到达后端后返回)
		return Promise.reject(err)
	}
)

下面的代码是我们平时发送 Get 请求的标准形态,then 会执行请求成功后的操作,catch 用来捕获错误。我们前面拦截响应后,无论是请求还是响应的拦截器,他们的 err 返回的 promise 都会进入 catch 中

axios.get().then().catch(err=>{})

取消拦截器

let inerceptors = axios.interceptors.request.use
(config=>{
     config.header = {
         auth:true
     }
     return config
})
// 如下:用 axios 全局去调用 interceptors,这样就取消拦截了
axios.inerceptors.request.eject(interceptors) 

实例:通过拦截器控制登陆状态

// 登录状态,有 token,后端通过 headers 中的 token 进行身份校验
let request = axios.create({})
request.interceptors.request.use
(config => {
   config.headers.token = '' // 发送请求前,统一将 token 加入到请求 headers
   return config
})
// 非登陆状态,无 token
let request2 = axios.create({})

5、参数配置方法

全局配置

// 两个实例:(格式类同)
axios.defaults.timeout = 1000 // 全局配置请求时长(单位:毫秒)
axios.defaults.baseURL = 'https://api.example.com'; // 统一配置请求基础 URL

实例配置

// 在创建实例时设置默认配置
const instance = axios.create({
  baseURL: 'https://api.example.com'
});

// 创建实例后可更改默认值
instance.defaults.headers.common['Authorization'] = AUTH_TOKEN;

优先级:请求配置 > 实例配置 > 全局配置

6、错误处理

// 首先设置两种拦截器
axios.interceptors.request.use(
	config =>{
		return config
	},
	err =>{
	return Promise.reject(err)
	}
)
axios.interceptors.response.use(
	res =>{
		return res
	},
	err =>{
		return Promise.reject(err)
	}
)

// 错误的获取
axios.get('/data.json').then(res=>{
	console.log(res)
})
.catch(err =>{
	console.log(err) // 所有错误处理都会进入此处
})

具体的实践过程中,我们需要创建一个统一的错误处理,将所有的错误类型都放在拦截其中,方便我们后面调用接口时使用

一个实例:

// 创建一个请求实例
let instance = axios.create({})
// 为请求实例添加请求拦截器
instance.interceptors.request.use(
	config =>{
		return config
	},
	err =>{
		// 请求错误,一般 http 状态码以 4 开头,常见:401 超时,404 not found 多为前端浏览器错误
		return Promise.reject(err)
	}
)
instance.interceptors.response.use(
	res=>{
		return res
	},
	err =>{
		// 响应错误,一般 http 状态码以 5 开头,500 系统错误,502 系统重启等,偏向于服务端返回的报错
        return Promise.reject(err)
  }
)

// 使用
instance.get('/data').then(res=>{
	console.log(res)
})
.catch(err => {
	console.log(err)
})

参考:完整过一遍axios,再也不怕写请求   axios中文文档|官方

与关于 axios 是什么?以及怎么用?相似的内容:

关于 axios 是什么?以及怎么用?

本文简单介绍了 axios 的概念和易混淆的几个前端概念,后边有详细列举了 axios 的用法。

关于开设go语言专题的说明

本专题写作的目的其实是分享go语言编程的使用场景,介绍go语言编程的方方面面,让大家能够用好这个由google公司发明的强力工具,提升大家在这方面的生产力,毕竟**”君子善假与物也“**嘛。 这里我先说明一下,我并不是一个对go语言的所有一切都认同的人,你会发现很多相关从业者也会吐槽go语言的“专制

关于go语言的那点事

本篇是语言讨论的“传统项目”。每个写go语言讨论的人,都会介绍它的发展历程,应用领域,优缺点和特点来介绍go语言的那点事,当然这点事只是我从我的视角来看的。

关于泰勒展开拉格朗日余项中值点的渐进性

之前学拉格朗日中值定理的时候做到一道涉及到特定函数中值渐进性的题,感觉似乎有一般的结论,推广了一下就是这样了。 感谢刘导拯救 $n=1$ 都不会证的我,感谢王佬指出这是中科大《数学分析教程》第三版问题 4.3.1。 设函数 $f(x)$ 在区间 $I$ 上有 $n+1$ 阶导数,$x_0 \in I

关于时间管理的一点建议

在成为 Tech Lead 之后我发现时间变得极度不够用,甚至会成为了我焦虑和殚精竭虑的源泉。因为我无法主动的去做我应该(定方向、做定期回顾)做和想做的事情,而总是被动的被他人牵着鼻子走:无穷无尽的决策请求、寻求帮助、会议邀约。

[转帖]关于字节序(大小端)的一点想法

https://www.zhihu.com/people/bei-ji-85/posts 今天在一个技术群里有人问起来了,当时有一些讨论(不完全都是我个人的观点),整理一下: 为什么网络字节序(多数情况下)是大端? 早年设备的缓存很小,先接收高字节能快速的判断报文信息:包长度(需要准备多大缓存)、地

[转帖]关于统信UOS操作系统版本介绍

https://blog.csdn.net/qq43748322/article/details/120196200 当下信创产业发展的如火如荼,今天聊聊统信操作系统UOS 相比较于其它国内品牌操作系统,统信UOS的版本、分支比较多,下面为大家详细说说各UOS版本 目前统信UOS系统主要分为桌面版和

[转帖]关于华为产品生命周期

关于企业级产品都有EOL里程碑,因些需要考虑对已购产品、业务的生命周期进行升级、迁移、替换等统筹规划。另外如果遇到产品、业务整体出售,还需要评估对现有资产的影响等不可控因素。 今天聊聊华为产品的生命周期,点击查看原文 华为产品生命周期关键里程碑: 华为软件版本生命周期关键里程碑: 点击查询华为产品生

[转帖]关于SRE方法论的一些笔记

写在前面 阿里系列有一本《云原生操作系统Kubernetes》中作者在前言里讲到Google开源的Kubernetes和《SRE Google运维解密》这本书是剑法和气功的关系换句话讲Kubernetes是术,SRE Google运维解密是道作为云原生基础设施的Kubernetes小伙伴么应该多少有

[转帖]关于一致性哈希算法在游戏服务器端的思考

https://www.jianshu.com/p/b8ae27cf22a9 突然想明白 其实网易的将军令 就是一个一致性哈希的玩法 关于一致性哈希算法在游戏服务器端的思考 需求分析 后端有很多逻辑node节点(not-section binded),节点启动后注册到注册中心 node本身有状态,有