〇、前言

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. // 1、安装 Axios 库
  2. // 在项目文件根目录下打开命令行,输入如下语句
  3. > npm install axios
  4. // 2、js 文件中引入
  5. import axios from 'axios';
  6. // 3、直接通过关键字 axios 发送 http 请求
  7. // Get 请求
  8. axios({
  9. method: 'get',
  10. url: 'URL文本'
  11. }).then(({data}) => {
  12. // 。。。
  13. }).catch((err) =>{
  14. console.log("catch-err:",err);
  15. }).finally(() =>{
  16. // 。。。
  17. })
  18. // Post 请求
  19. axios({
  20. headers:{'content-type':'application/json'},
  21. method: 'post',
  22. url: 'URL文本',
  23. data:JSON.stringify({"dataid":dataid})
  24. }).then(({data}) => {
  25. console.log("then-data:",data);
  26. }).catch((err) =>{
  27. console.log("catch-err:",err);
  28. }).finally(() =>{
  29. // 。。。
  30. })

2、ASP.NET Core MVC 项目

  1. @* 1、引用 js 包的 CDN *@
  2. <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
  3. @* 2、通过关键字 axios 发送 http 请求 *@
  4. <script>
  5. // 调用方法 message() 查看测试结果
  6. window.onload = function () {
  7. // Get 请求
  8. axios.get('https://localhost:44360/api/Methodname', {
  9. params: {
  10. mingcheng: '网络科技'
  11. },
  12. headers: {
  13. 'token': '1111',
  14. }
  15. }
  16. ).then(ret => {
  17. console.log("get:", ret);
  18. })
  19. // Post 请求
  20. axios.post('https://localhost:44360/api/Methodname',
  21. {
  22. "id": "df332b50-4abf-4fe6-814b-6d330a9ecc73",
  23. "gongsix": "线下"
  24. },
  25. {
  26. headers: {
  27. 'token': '1111',
  28. }
  29. }
  30. ).then(ret => {
  31. console.log("post:", ret);
  32. })
  33. }
  34. </script>

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

简要的三个步骤如下:

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

    

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

  1. @* 注意路径代表 wwwroot 文件夹中,要对应得上 *@
  2. <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. // (调用型1)查询给定 ID 的 user 对象请求
  2. axios.get('/user?ID=12345')
  3. .then(function (response) {
  4. console.log(response);
  5. })
  6. .catch(function (error) {
  7. console.log(error);
  8. });
  9. // (调用型2)另一种写法
  10. axios.get('/user', {
  11. params: {
  12. ID: 12345
  13. }
  14. })
  15. .then(function (response) {
  16. console.log(response);
  17. })
  18. .catch(function (error) {
  19. console.log(error);
  20. });
  21. // (方法型)写法
  22. axios({
  23. method:'get',
  24. url:'/data.json',
  25. params:{
  26. id:'12345'
  27. }
  28. }).then((res)=>{
  29. console.log(res)
  30. })

2、Post 请求

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

  1. // 先定义一个入参 data
  2. let data = { id : 12 }
  3. // (调用型)写法
  4. axios.post('/post',data)
  5. }).then((res)=>{
  6. console.log(res)
  7. })
  8. // (方法型)写法
  9. axios({
  10. method:'post',
  11. url:'/post',
  12. data:data
  13. }).then((res)=>{
  14. console.log(res)
  15. })

关于 Post 请求的 Content-Type:

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

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

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

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

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

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

4、拦截器

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

请求拦截器

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

响应拦截器

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

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

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

取消拦截器

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

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

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

5、参数配置方法

全局配置

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

实例配置

  1. // 在创建实例时设置默认配置
  2. const instance = axios.create({
  3. baseURL: 'https://api.example.com'
  4. });
  5. // 创建实例后可更改默认值
  6. instance.defaults.headers.common['Authorization'] = AUTH_TOKEN;

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

6、错误处理

  1. // 首先设置两种拦截器
  2. axios.interceptors.request.use(
  3. config =>{
  4. return config
  5. },
  6. err =>{
  7. return Promise.reject(err)
  8. }
  9. )
  10. axios.interceptors.response.use(
  11. res =>{
  12. return res
  13. },
  14. err =>{
  15. return Promise.reject(err)
  16. }
  17. )
  18. // 错误的获取
  19. axios.get('/data.json').then(res=>{
  20. console.log(res)
  21. })
  22. .catch(err =>{
  23. console.log(err) // 所有错误处理都会进入此处
  24. })

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

一个实例:

  1. // 创建一个请求实例
  2. let instance = axios.create({})
  3. // 为请求实例添加请求拦截器
  4. instance.interceptors.request.use(
  5. config =>{
  6. return config
  7. },
  8. err =>{
  9. // 请求错误,一般 http 状态码以 4 开头,常见:401 超时,404 not found 多为前端浏览器错误
  10. return Promise.reject(err)
  11. }
  12. )
  13. instance.interceptors.response.use(
  14. res=>{
  15. return res
  16. },
  17. err =>{
  18. // 响应错误,一般 http 状态码以 5 开头,500 系统错误,502 系统重启等,偏向于服务端返回的报错
  19. return Promise.reject(err)
  20. }
  21. )
  22. // 使用
  23. instance.get('/data').then(res=>{
  24. console.log(res)
  25. })
  26. .catch(err => {
  27. console.log(err)
  28. })

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

关于 axios 是什么?以及怎么用?的更多相关文章

  1. 为什么axios请求接口会发起两次请求

    之前在使用axios发现每次调用接口都会有两个请求,第一个请求时option请求,而且看不到请求参数,当时也没注意,只当做是做了一次预请求,判断接口是否通畅,但是最近发现并不是那么回事. 首先我们知道 ...

  2. axios基本用法

    vue更新到2.0之后,作者就宣告不再对vue-resource更新,而是推荐的axios,前一段时间用了一下,现在说一下它的基本用法. 首先就是引入axios,如果你使用es6,只需要安装axios ...

  3. Axios、Lodash、TweenJS

    Axios是一个基于promise的HTTP库 http://chuansong.me/n/394228451820 Lodash是一个JavaScript的函数工具集 http://www.css8 ...

  4. axios全攻略

    随着 vuejs 作者尤雨溪发布消息,不再继续维护vue-resource,并推荐大家使用 axios 开始,axios 被越来越多的人所了解.本来想在网上找找详细攻略,突然发现,axios 的官方文 ...

  5. 抛弃vue-resource拥抱axios

    vue-resource用法 import Vue from 'vue' import VueResource from 'vue-resource' Vue.use(VueResource) 是不是 ...

  6. Vue+axios 实现http拦截及路由拦截

    现如今,每个前端对于Vue都不会陌生,Vue框架是如今最流行的前端框架之一,其势头直追react.最近我用vue做了一个项目,下面便是我从中取得的一点收获. 基于现在用vue+webpack搭建项目的 ...

  7. vue使用Axios做ajax请求

    vue2.0之后,就不再对vue-resource更新,而是推荐使用axios 1. 安装 axios $ npm install axios 或 $ bower install axios 2. 在 ...

  8. vue全家桶(Vue+Vue-router+Vuex+axios)(Vue+webpack项目实战系列之二)

    Vue有多优秀搭配全家桶做项目有多好之类的咱就不谈了,直奔主题. 一.Vue 系列一已经用vue-cli搭建了Vue项目,此处就不赘述了. 二.Vue-router Vue的路由,先献上文档(http ...

  9. 9.如何解决出现AXIOS的Request header field Content-Type is not allowed by Access-Control-Allow-Headers in preflight response.

    问题描述: 由于restful接口需要在头部header传递两个字段: Content-Type: application/jsonAccess-Token: 84c6635800b14e0eba4f ...

  10. vue2.0设置proxyTable使用axios进行跨域请求

    这里请求的是知乎日报的api,由@izzyleung这位大神提供的,这是github地址. 在vue-cli构建的项目中先安装axios npm install axios -S 这里暂不考虑用vue ...

随机推荐

  1. [Java EE]辨析: POJO(PO / DTO / VO) | BO/DO | DAO

    概念不清,会很影响开发中的逻辑性和条理性,进而影响接口设计,代码编写的质量. 网络上大家对这些个概念的探究很多,但终究没有一个统一的说法. 不论哪家解释,我觉得最重要的是: 1)词汇之间的解释统一: ...

  2. python选出一定数量的随机文件到某个文件夹

    import os import random import shutil def move_file(target_path, save_path, number): file_list = os. ...

  3. Redis(六)集群

    Redis集群 1.1 存在的问题 容量不够Redis如何扩容 并发写操作,Redis如何分摊 当主机或者从机宕机,薪火相传.反客为主等主从模式都会导致ip发生变化,应用程序中的配置需要对应修改主机地 ...

  4. 参与开源之夏 x OpenTiny 跨端跨框架 UI 组件库贡献,可以赢取奖金🏆!这份《OpenTiny 开源贡献指南》请收好🎁!

    大家好,我是 Kagol. 近期有几位朋友在 OpenTiny 技术交流群里询问我们在开源之夏(OSPP)的项目,希望能提前做一些准备工作. 这里给大家简单介绍下开源之夏. 开源之夏是由中科院软件所& ...

  5. Java学习笔记13

    1.Date类 1.1 概述 ​ java.util.Date类表示特定的瞬间,精确到毫秒. 1.2 构造方法 Date类有多个构造方法,部分已经过时. 方法 作用 public Date() 从此刻 ...

  6. include-file

    0X01 前言 这篇文章介绍文件包含漏洞. 0X02 最常见的两个函数的形象解释: 我们知道文件包含最常见的是两个函数 include() require()(这里就不谈他们的亲戚 include_o ...

  7. Android JAVA连接MQTT,以及常见问题

    本文介绍如何使用Android(JAVA)客户机连接MQTT服务器 第一步先引入MQTT 在 build.gradle 添加以下: dependencies { implementation 'org ...

  8. C# 无需管理员权限提示,操作C盘文件

    在C盘创建.移动文件,如果当前不是管理员身份,是没办法直接操作. 如果当前程序有管理员权限,那可以直接操作. 但是,添加管理员权限启动,会弹出用户确认提示框. 在某些场景下,其实是不想让用户看到这样的 ...

  9. 使用Jmeter进行CPU、内存等监控

    一.需要的准备 1.jp@gc - PerfMon Metrics Collector插件(安装方法就不过多介绍啦!) 2.ServerAgent服务器(下载:https://github.com/u ...

  10. vue页面中展示markdown以及katex公式

    场景 数据库中有markdown语法的字符串,需要展示为正常的页面,难点在于其中的katex数学公式 解决方式 使用showdown及其族系插件 npm i showdown npm i showdo ...