【Vue】Axios详解

news2025/2/25 21:34:00

文章目录

  • 1 Axios简介
    • 1.1 什么是Axios?
    • 1.2 Axios的特性
  • 2 Axios的使用
    • 2.1 Axios的安装
    • 2.2 Axios的创建
      • 2.2.1 Proxy配置代理
        • 2.2.1.1 核心代码
        • 2.2.1.2 代码解释
        • 2.2.1.3 多个跨域
      • 2.2.2 Axios的二次封装
        • 2.2.2.1 为什么要二次封装
        • 2.2.2.2 Axios实例化
          • 2.2.2.2.1 引入
          • 2.2.2.2.2 创建axios
          • 2.2.2.2.3 配置请求拦截器
          • 2.2.2.2.4 配置响应拦截器
          • 2.2.2.2.5 暴露
          • 2.2.2.2.6 例子
    • 2.3 Axios的直接使用
      • 2.3.1 get请求
        • 2.3.1.1 无参
        • 2.3.1.2 有参
      • 2.3.2 Post请求
      • 2.3.3 通用(常用)
        • 2.3.3.1 无参
        • 2.3.3.2 有参
      • 2.3.4 例子
    • 2.4 接口统一管理
      • 2.4.1 接口统一管理的原因
      • 2.4.2 接口管理
        • 2.4.2.1 新建一个index.js文件 放置接口,引入axios
        • 2.4.2.2 编写接口方法
        • 2.4.2.3 接口全局注册

1 Axios简介

1.1 什么是Axios?

Axios 是一个基于 promise 网络请求库,作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests。

1.2 Axios的特性

  • 从浏览器创建 XMLHttpRequests

  • 从 node.js 创建 http 请求

  • 支持 Promise API

  • 拦截请求和响应

  • 转换请求和响应数据

  • 取消请求

  • 自动转换JSON数据

  • 客户端支持防御XSRF

2 Axios的使用

2.1 Axios的安装

npm install axios

在控制台输入 npm install axios – 回车,当看到package-lock.json的packages里面有了axios,说明引入成功

image-20221008115743040

image-20221008115657962

2.2 Axios的创建

2.2.1 Proxy配置代理

官方文档传送门 https://cli.vuejs.org/zh/config/#devserver-proxy

2.2.1.1 核心代码

const { defineConfig } = require("@vue/cli-service")

module.exports = defineConfig({
  lintOnSave: false,
  transpileDependencies: true,
  devServer: {
    proxy: {
      '/api': {
        target: "http://localhost:9000", //需要跨域的目标地址
        pathRewrite: { '^/api': '' },//将带有api的路径重写为''
        ws: true,//用于支持WebSocket
        changeOrigin: true,//用于控制请求头的Host
      },
    }
  }

}
)

2.2.1.2 代码解释

image-20221007213614832

‘/api’:当请求地址的前缀中有该字符串时会进行跨域操作,反之则在本地请求。

前缀如localhost:8080/api/student,这里的api就是前缀。

localhost:8080/student/api,这里的api就不是前缀,student是他的前缀

target:要跨域的地址,在上图即为localhsot:5001

pathRewrite:路径重写

404错误问题:

当本地服务器以/api/student的路径请求服务器的时候,代理服务器检测到’api’需要跨域,然后如实转发。所以到达5001端口的时候,会去api/Student找自己想要的资源,但是5001端口只有Student,所以会爆404错误

使用pathRewrite,会将访问地址中的该前缀替换为:后面的字符,这里是’',所以到达5001的时候,会正确的访问Student找到自己想要的资源。

image-20221007214058984

changeOrigin:用于控制请求头的Host

值为false,当在端口5001,询问这个请求从哪来的,请求会如实回答:8080。

值为true,当在端口5001,询问这个请求从哪来的,请求会撒谎:5001,你在哪我的回答就是哪

2.2.1.3 多个跨域

如果需要多个跨域的话,只需要继续往下写即可。

image-20221008102712439

2.2.2 Axios的二次封装

2.2.2.1 为什么要二次封装

image-20221007215221059

请求拦截器、响应拦截器:请求拦截器可以在发送请求之前处理一些业务

当数据返回后,响应拦截器可以处理一些业务

2.2.2.2 Axios实例化

可以直接看2.2.2.2.6

2.2.2.2.1 引入

新建一个api文件,创建request.js 用于引入axios

image-20221008103123027

2.2.2.2.2 创建axios
const requests = axios.create({
    baseURL: '/api',
    timeout: 50000,
 });
  • baseURL:追加一个前缀,如你需要访问的地址是localhost:9000/api/song/SongSheet在访问的时候,你只需要写成’localhost:9000/song/SongSheet’
  • timeout:访问超时的时间ms,超过这个时间即为访问失败
2.2.2.2.3 配置请求拦截器
// 添加请求拦截器
requests.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么,例如加入token
    return config;
  }, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  });

这里也解决了我困惑已久的一个问题:为什么以前返回的数据没有code,只有单纯的一个数据。

我一度以为要在后端写。

如果这里返回的是config,那么就会有data,status,statusText, headers等等,如果只是返回config.data,那么你看到的就只有data数据了。

2.2.2.2.4 配置响应拦截器
requests.interceptors.response.use(function (response) {
    // 在接收响应时做些什么,例如跳转到登录页
    return response;
  }, function (error) {
    // 对响应错误做点什么
    return Promise.reject(error);
  });
2.2.2.2.5 暴露

如果不暴露是不能用的

export default requests;
2.2.2.2.6 例子
import axios from "axios";
const requests = axios.create({
    baseURL: '/api',
    timeout: 50000,
  });
// 添加请求拦截器
requests.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么,例如加入token
    return config;
  }, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  });
// 添加响应拦截器
requests.interceptors.response.use(function (response) {
    // 在接收响应时做些什么,例如跳转到登录页
    return response;
  }, function (error) {
    // 对响应错误做点什么
    return Promise.reject(error);
  });

  
export default requests;

2.3 Axios的直接使用

此处的requests 是2.2中axios.create()返回的值,使用前需要引入requests

2.3.1 get请求

2.3.1.1 无参

requests.get('url');

举例:如我想要访问的是localhost:9000/api/song/SongAllSheet

api在baseURL里面配置了,所以我只需要写成

 requests.get('/song/SongAllSheet');

2.3.1.2 有参

/Opera/getPersonalOpera是URL,value是你参数的名字

requests.get(`/Opera/getPersonalOpera/${value}`);

2.3.2 Post请求

axios.post("url",{
		params:{
				 name:'jok',
				 age:'18'
			   }
})

2.3.3 通用(常用)

2.3.3.1 无参

get请求methods:后面为get,post则为post

requests({url:'/Opera/getPersonalOpera',methods:'get'})

2.3.3.2 有参

此处用的是``,英文下,Tab上面的那个键

requests({url:`/Opera/getPersonalOpera/${value}`,methods:'get'})

2.3.4 例子

<template>
  <div class="hello">
  </div>
</template>

<script>
import requests from "@/api/request"
export default {
  name: 'HelloWorld',
  data() {
    return{
      Song: [],
      secondSong:[],
      thirdSong:[],
    }
  }, methods: {
    async getAllSongs() {
      let result = await requests.get('/song/SongAllSheet');
      if(result.status == 200)
      {
        this.Song =  result.data;
      }
      
    },
    async getSongById(value)
    {
       let result = await requests({url:`/Opera/getPersonalOpera/${value}`,methods:'get'})
        if(result.status == 200)
        {
            this.secondSong = result.data;
        }
       
    }
  },
  mounted() {
 
      this.getAllSongs();
      this.getSongById(1);
  },
  
}
</script>

 

可以看到是成功拿到数据的

image-20221008113044121

解决返回数据是Promise的情况

image-20221008111128215

image-20221008111508103

所以只需要在方法里面直接赋值即可

2.4 接口统一管理

2.4.1 接口统一管理的原因

对于较小的项目,使用时在撰写无伤大雅

对于一些比较大型项目,随意写接口,如果后端的接口稍有改动,那么维护起来非常的困难

所以把所有的接口放在一起,而且抽象成一个方法,这样使用起来不需要重复写,而且改动起来也比较方便

2.4.2 接口管理

2.4.2.1 新建一个index.js文件 放置接口,引入axios

image-20221008113735517

import requests from "./request";

2.4.2.2 编写接口方法

原版

export const reqGetAllSongById = (value)=>{
    return requests({url:`/Opera/getPersonalOpera/${value}`,methods:'get'});
}
export const reqGetAllSong = ()=>{
    return requests({url:'/Opera/getPersonalOpera',methods:'get'});
}

简写版

export const reqGetAllSong = ()=>requests({url:'/Opera/getPersonalOpera',methods:'get'});
export const reqGetAllSongByType = (value)=>  requests({url:`/Opera/getPersonalOpera/${value}`,methods:'get'});

2.4.2.3 接口全局注册

这样虽然好管理了,但是如果使用的话,还需要一一引入。

image-20221008115507272

在如上位置,写如下代码


import * as API from '@/api'
 beforeCreate(){
    Vue.prototype.$API = API;
  },

使用之时,前缀加上this.$API便可正常使用

image-20221008115556329

<template>
  <div class="hello">
  </div>
</template>

<script>
import requests from "@/api/request"
export default {
  name: 'HelloWorld',
  data() {
    return{
      Song: [],
      secondSong:[],
      thirdSong:[],
    }
  }, methods: {
    async getAllSongs()
    {
      let result = await this.$API.reqGetAllSongByType(1);
      if(result.status==200)
      {
        this.Song = result.data;
      }
    }
  },
  mounted() {
    this.getAllSongs();
      
  },
  
}
</script>

 

访问成功

image-20221008115256379

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/405482.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端面试题八股文汇总(最新)

文章目录一 、第一回合1.开发中遇到的困难&#xff1f;2. Css的盒子模型3. Pull和fetch的区别4. SPA单页面项目5.SEO优化6.BOM浏览器对象模型7.数组、对象、字符串中的一些方法8.解构赋值9...args剩余参数(扩展运算符)10.arguments 对象11. Promise以及底层封装12.浅拷贝深拷贝…

【node进阶】一文带你快速入门koa框架

✅ 作者简介&#xff1a;一名普通本科大三的学生&#xff0c;致力于提高前端开发能力 ✨ 个人主页&#xff1a;前端小白在前进的主页 &#x1f525; 系列专栏 &#xff1a; node.js学习专栏 ⭐️ 个人社区 : 个人交流社区 &#x1f340; 学习格言: ☀️ 打不倒你的会使你更强&a…

Vue基础知识总结 11:前端路由vue-router

&#x1f345; 作者简介&#xff1a;哪吒&#xff0c;CSDN2021博客之星亚军&#x1f3c6;、新星计划导师✌、博客专家&#x1f4aa; &#x1f345; 哪吒多年工作总结&#xff1a;Java学习路线总结&#xff0c;搬砖工逆袭Java架构师 &#x1f345; 关注公众号【哪吒编程】&#…

vue自适应布局(各种浏览器,分辨率)

1.前言 spa页面的layout布局对于前端项目的影响至关重要&#xff0c;在我们进行web端开发的时候&#xff0c;前端的各种大小屏幕&#xff0c;各种内核的浏览器不同&#xff0c;会导致我们的页面呈现出不一样的效果&#xff0c;如何进行更好的取舍&#xff0c;怎么能够达到产品…

使用Nginx部署Vue+SpringBoot前后端分离项目(超详细!)

目录 一、前后端环境准备 1、前端环境准备 2、后端环境准备 二、前后端打包 1、前端打包 2、后端打包 三、服务器前后端配置及部署 1、前端配置 安装nginx 创建项目目录 前端项目部署 2、后端配置 安装宝塔 安装mysql 使用本地Navicat连接远程数据库 安装jdk环境…

echarts文档解读

前言&#xff1a;今天给大家分享一个前端的开源可视化图标库echarts。 &#x1f495;点击下方名片&#xff0c;即可领取学长个人微信&#x1f495; echarts 全局 echarts 对象&#xff0c;在 script 标签引入 echarts.js 文件后获得&#xff0c;或者在 AMD 环境中通过 require…

Vue 插槽(slot)详细介绍(对比版本变化,避免踩坑)

目录 前言 正文 插槽是什么&#xff1f; 怎么使用插槽&#xff1f; 基本用法 后备&#xff08;默认&#xff09;内容 具名插槽 作用域插槽 插槽版本变化 总结 前言 Vue中的插槽&#xff08;slot&#xff09;在项目中用的也是比较多的&#xff0c;今天就来介绍一下插…

npm install 提示Unable to authenticate, need: BASIC realm=“Sonatype Nexus Repository Manager“

场景&#xff1a; 执行npm install时提示Unable to authenticate Password: Email: (this IS public) xxqq.com Logged in as uploader on http://192.168.xx.xxx:8074/repository/npm-internal/. PS D:\GitworkspaceUi\gisquest-cloud-ui-workcenter> npm install npm ERR…

【登录界面】vue、element-ui登录界面模板

vue、element-ui登录界面模板这里总结一个用vue、element-ui写的登录界面&#xff0c;为以后复制粘贴备用。 截图 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>登录</title><!--…

vue-quill-editor富文本编辑器使用步骤

首先放上效果图 目录 1.安装 2.引入到项目中 3.在页面上写组件 4.配置option 5.给工具栏鼠标悬停加上中文释义 6.上传图片到七牛云 7.自定义控制图片大小 1.安装 npm install vue-quill-editor -S2.引入到项目中 有两种挂载方式&#xff1a; 全局挂载 和 在组件中挂载&…

【Vue插槽详解】

Vue插槽详解Vue插槽的作用一、默认插槽完整代码&#xff1a;二、具名插槽完整代码&#xff1a;三、作用域插槽完整代码如下&#xff1a;Vue插槽的作用 Vue插槽是Vue中常见的一种组件间的相互通信方式&#xff0c;作用是让父组件可以向子组件指定位置插入html结构&#xff0c;适…

记录--前端性能优化——首页资源压缩63%、白屏时间缩短86%

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 提升首屏的加载速度&#xff0c;是前端性能优化中最重要的环节&#xff0c;这里笔者梳理出一些 常规且有效 的首屏优化建议 目标&#xff1a; 通过对比优化前后的性能变化&#xff0c;来验证方案的有效…

除夕最绚丽3D烟花代码(html+音效)

今天就是除夕了&#xff0c;新年怎么能少得了烟花呢&#xff1f;虽然绝大部分地区禁止燃放烟花&#xff0c;但该欣赏的烟花还是要欣赏滴~~ 最近整理文件&#xff0c;找到了一份烟花代码&#xff0c;3D特效&#xff0c;今天分享给大家&#xff0c;希望大家喜欢。 话不多说&#…

uni.getLocation和wx.getLocation方法调用无效,也不返回失败,解决方案!!!

线上已解决问题的代码 记录时间 2022.12.10 //获得地理定位信息uni.getLocation({type: wgs84,success: function(resp) {console.log(11111);//保存纬度数据let latitude resp.latitude;//保存经度度数据let longitude resp.longitude;console.log(经度 latitude);console…

【Vue项目搭建】修改【若依框架】的侧边栏、导航栏、面包屑样式、修改全局页面样式

掌握分寸感&#xff0c;找目标一致的人协同你&#xff0c;有效地调配资源&#xff0c;就可以提高效率。 写在前面的话&#xff1a;博主最近想要搭建自己的前端若依项目&#xff0c;因此此系列博客会做一些记录。我的项目gitee地址&#xff1a; https://gitee.com/xuruicong/rac…

less和sass的区别[简洁易懂]

一、基础知识 1.sass&#xff0c;less都是CSS的预处理器&#xff0c;其基本思想就是用编程的思路编写CSS代码。增加了变量&#xff0c;嵌套&#xff0c;函数&#xff0c;语句&#xff0c;继承等概念。有助于模块化开发&#xff0c;例如写一个换肤的效果&#xff0c;以前我们需要…

前端200道面试题及答案(更新中)

目录 html相关 1&#xff09;说一下对cookie和Storage(localStorage和sessionStorage) 的认识和区别&#xff1f; 2&#xff09;link和import的区别 3&#xff09;浏览器如何实现不同标签页的通信&#xff1f; 4&#xff09;iframe的优缺点 5&#xff09;canvas 6&#x…

Sublime Text 4 (Build 4143) 注册方法STEP BY STEP

To 初学Python的Pythonista: Sublime Text相对于PyCharm和Visual Studio Code&#xff0c;确实有不足之处&#xff0c;但提供了众多功能丰富的插件&#xff0c;且最大优点就是相对于Pycharm和VSCODE&#xff0c;它体积小&#xff0c;启动速度快。对于Python的初学者来说&#…

JavaScript基础总结---重点

目录JavaScript简介什么是JavaScript浏览器执行JS过程JS的组成JS的引入方式函数与作用域arguments的使用全局变量与局部变量预解析对象创建对象的三种方式1.利用字面量创建对象2.利用 new Object 创建对象3.利用构造函数创建对象遍历对象属性变量、属性、函数、方法总结new关键…

节点流和处理流详解

CSDN话题挑战赛第2期 参赛话题&#xff1a;学习笔记 1. 基本介绍 节点流可以从一个特定的数据源读写数据&#xff0c;如FileReader&#xff0c;FileWriter处理流&#xff08;也叫包装流&#xff09;是“连接”在已存在的流&#xff08;节点流或处理流&#xff09;之上&#x…