vue前端学习——axiosAPI请求

本文介绍了如何在Vue.js项目中安装和使用Axios进行网络请求,包括基本的GET和POST请求,批量请求,全局配置以及创建axios实例。同时,详细阐述了Axios的拦截器功能,用于在请求前和响应后添加额外的操作,例如设置全局基础URL、处理错误等。最后,展示了如何将axios请求封装到独立模块以提高代码复用性和可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、网络请求

1、安装axios

npm install axios --save
npm install axios@0.18.0 --save

2、基本使用

import Vue from 'vue'
import App from './App'
import router from './router'
import axios from 'axios'

Vue.config.productionTip = false

/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  render: h => h(App)
})
// axios({
//   url: 'http://123.207.32.32:8000/home/multidata',
//   method: 'get'
// }).then(res=>{
//   console.log(res)
// })
// axios({
//   //url:'http://123.207.32.32:8000/home/data?type=pop&page=1',
//   url:'http://123.207.32.32:8000/home/data',
//   params: {
//     type: 'pop',
//     page: 1
//   }
// }).then(res=>{
//   console.log(res)
// })

// axios.all([axios({
//   url: 'http://123.207.32.32:8000/home/multidata'
// }),axios({
//   url: 'http://123.207.32.32:8000/home/data',
//   params: {
//     type: 'sell',
//     page: 4
//   }
// })
// ]).then(result=>{
//   console.log(result)
// })

axios.default.baseURL = 'http://123.207.32.32:8000' //相同的路径
axios.default.timeout = 5000 //设置超时时间


axios.all([axios({
  url: '/home/multidata'
}),axios({
  url: '/home/data',
  params: {
    type: 'sell',
    page: 4
  }
})
]).then(axios.spread((res1,res2) =>{
  console.log(res1);
  console.log(res2);
}))

3、数据接收到前端

<template>
  <div id="app">
  <div>{{result}}</div>
  </div>
</template>

<script>
  import axios from 'axios'

export default {
  name: 'App',
  components:{

  },
  data(){
    return {
      result: ''
    }
  },
  created() {
    axios({
      url:'http://123.207.32.32:8000/home/multidata'
    }).then(res=>{
      console.log(res)
      this.result =res;
    })
  }
}
</script>

<style>

</style>

4、axios拦截器

import axios from 'axios'


export function request(config){
  //1、创建axios实例
    const instance = axios.create({
      baseURL: 'http://123.207.32.32:8000',
      timeout: 5000
    })
    //2.拦截器
    //全局拦截:axios.interceptors.request;
    instance.interceptors.request.use(config =>{
     // console.log(config)
      //1、比如说config中的一些信息不符合服务器的要求,信息转化,配置相关
      //2、比如每次发送网络请求是,都希望在界面中显示一个请求图标
      //3、某些网络请求(比如登录,(token)),必须携带一些特殊的信息,拦截登录完善。
      return config
    },err =>{
      console.log(err)
    })
    //1、响应拦截
    instance.interceptors.response.use(res => {
      console.log(res);
      //拦截后,需要返回数据,否则处理之后没有返回数。就被拦截了。
      return res.data
    },err => {
      console.log(err)
    })
    //3.发送网路请求
    //2.1、请求成功在撤销请求图标
    return instance(config)
}
//------------------------3-----------------
// export function request(config){
// return new Promise((resolve,reject)=>{
//   //1、创建axios实例
//     const instance = axios.create({
//       baseURL: 'http://123.207.32.32:8000',
//       timeout: 5000
//     })

//   instance(config).then(res => {
//     resolve(res)
//   }).catch(err =>{
//     reject(err)
//   })
// })
// }
// -------------------回调实现---------------------
// export function request(config,success,failure){
//   //1、创建axios实例
//   const instance = axios.create({
//     baseURL: 'http://123.207.32.32:8000',
//     timeout: 5000
//   })

// instance(config).then(res => {
//   //console.log(res)
//   success(res)
// }).catch(err =>{
//   //console.log(err)
//   failure(err)
// })
// }
// ---------2----------------
// export function request(config){
//   //1、创建axios实例
//   const instance = axios.create({
//     baseURL: 'http://123.207.32.32:8000',
//     timeout: 5000
//   })

// instance(config.baseConfig).then(res => {
//   //console.log(res)
//   config.success(res)
// }).catch(err =>{
//   //console.log(err)
//   config.failure(err)
// })
// }

二、重温axios

1、请求方式

axios(config)

axios.request(config)

axios.get(url[,config])

axios.delete(url[,config])

axios.head(url[,config])

axios.post(url[,data[,config]])

axios.put(url[,data[,config]])

axios.patch(url[,data[,config]])

2、import关键字

1)可以导入第三方包

如:import axios from 'axios'

3、使用详情

1)axios(config)

a、config参数
url:'http://localhost:80/add/addUser'	//参数controller地址
method: 'get'  //设置请求方式。post或者get

.then()  //访问成功后的回调
axios()	//这个方法会返回一个permission对象,拿到数据调用resolve,执行then()方法。
b、使用
axios.post()
axios.get()
c、返回值

概述:返回值是axios框架默认设置的。

config
data	//返回的数据
headers		//请求头
request
status
statusText
d、集体代码
axios({
  url:''
}).then(res=>{
console.log(res);//获取返回对象
})
//config是一个对象
//默认请求是get

2)发送带参请求

a、直接拼接
axios({
  url:'http://192.168.1.1:800/home/data?type=sell&page=3'
}).then(res=>{
  console.log(res)
})
axios({
  url:'http://192.168.1.1:800/home/data',
  params:{
    type: 'pop',
    page: 1
  }
}).then(res=>{
  console.log(res)
})
b、多请求协作

1、方式一:写一个函数同意处理二个请求的返回结果。

2、axios发送并发请求

//这个属性可以全局
axios.defaults.baseURL = 'http://123.207.32.32:8000'

//一个方法内部传入数组,数组里面,传递axios对象。then处理请求返回的数据
axios.all([axios({
    url:'/home/multidata'
}),axios({
    baseURL: 'http://123.207.32.32:8000',
    url:'/home/data',
    params:{
        type:'sell',
        page: 4
    }
})]).then(results =>{
    //处理返回内容
    console.log(results)
})

返回结果处理

//对多个返回对象做分割,单独取出来。
.then(axios.spread((res1,res2)=>{
	console.log(res1);
    console.log(res2);
}))
c、对象的解构
//对象解构
const obj = {
name:'kobe',
age: 30
}
const {name,age} = obj;

//数组解构
const names = ['why','kobe','james']
const [name1,name2,name3] = names;
d、axios全局配置
//全局配置访问路径
axios.defaults.baseURL = 'http://123.207.32.32:8000'
//超时时间
axios.defaults.timeout = 5000

在这里插入图片描述

3)、创建axios实例,实例独立配置axios参数

概述:为了满足多个请求地址,创建实例

const instance1 = axios.create({
baseURL: 'http://222.111.22.33:8000',
timeout: 5000
})

instance1({
url:'/home/multidata',
}).then(res =>{
	console.log(res)
})

instance1({
  url:'/home/multidata',//基于baseURL请求的接口
  params: {
      type:'pop',//传递的参数,这个参数会跟随url传递。
      page: 1
  }
}).then(res =>{
	console.log(res)
})

const instance2 = axios.create({
    baseURL: 'http://222.111.22.33:8000',
    timeout: 10000
})

4)、封装axios网络请求

1、根据生命周期来发送网络请求

HelloWorld.vue
<template>
	<h2>{{categories}}</h2>
-------------------------------
	<HelloWorld></HelloWorld>//调用模板
</template>
<script>
    //导入axios网络请求
 import axios from 'axios'
    //导入组件
    import HelloWorld from './components/helloWorld'
    export default {
        name: "HelloWorld",//设置模板导出名称
        componrnt: {
            HelloWorld//模板组件 申明
        },
        data(){//设置数据域
            return {
                categories: ''
            }
        },
        created(){//当这个组件被创建的时候发起网络请求
            axios({
                url: 'http://123.11.21.32:8000/category'
            }).then(res => {
                this.categories = res;//接受请求返回的对象
            })
        }
    }
</script>

缺点:网络耦合度太高,后期框架维护缺陷。

1、新建request.js
#request.js

import axios from 'axios'

export function request(config,succes,failure){
	//1.创建axios的实例。
    const instance = axios.create({
        baseURL: 'http://123.203.32.32:8000',
        timeout: 5000
    })
    //发送真正的网络请求
    instance(config)
        .then(res =>{
        console.log(res);
        success(res);//通过这个函数,把返回结果回调出去。
    })
   .catch(err =>{
        console.log(err);
        failure(err)//通过这个函数把,返回的东西回调出去。
    })
}

export function instance2(){

}
2、使用request.js封装的axios模块
#main.js
import {request} from "./network/request";//这种方式,是导入的某个js文件的,函数。大括号里面的是函数名称。
request({
    url: '/home/multidata'
},res =>{
    console.log(res)
},err =>{
    failure(err)
})
//request()有三个参数,config,success,failure
//
//
//
//
//

3、封装request函数只传一个参数
#main.js

import {request} from "./network/request"

request({
    baseConfig: {
        
    },
    success: function(res){
        
    },
    failure(err){
        
    }
})

4、promise封装axios的request.js

#request.js

import axios from 'axios'

export function request(config){
	return new Promise((resolve,reject)=>{
		//1.创建axios的实例。
    const instance = axios.create({
        baseURL: 'http://123.203.32.32:8000',
        timeout: 5000
    })
    //发送真正的网络请求
    instance(config)
   .then(res => {
        resolve(res)
    })
   .catch(err => {
        reject(err)
    })
	})
}
#main.js

import {request} from "./network/request"


request({url: '/home/multidata'})
.then(res =>{console.log(res);})
.catch(err=>{console.log(err);})

5、直接return axios

#request.js


import axios form 'axios'
export function request(config){
    const instance = axios.create({
        baseURL: 'http://123.21.12.12:8000',
        timeout: 5000
    })
    return instance(config)//create函数本身返回的是promise调用的时候。request可以直接.then.catch
}
#main.js

import {request} from "./network/request"

request({
    url:'/home/multidata'
        })
    .then(res=>{})
.catch(err=>{})

三、axios拦截器

1、拦截内容

(1)请求拦截

instance.interceptors.request.use(
config =>{
console.log('来到了request拦截success中');
return config
},
err=>{
console.log('来到了request拦截failure中')return err
}
)

(2)响应拦截

instance.interceptors.response.use(
    response => {
    console.log('来到了response拦截success中');
    return response.data
},
    err =>{
        console.log('来到了response拦截failure');
        return err
    }                              
)

2、拦截器使用

#request.js


import axios form 'axios'
export function request(config){
    //1.创建axios的实例
    const instance = axios.create({
        baseURL: 'http://123.21.12.12:8000',
        timeout: 5000
    })
    //2.axios的拦截器,全局拦截
    //axios.interceptors
    //拦截局部实例,拦截请求
    //2.1、请求拦截的作用
    instance.interceptors.request.use(
    	aaa/config =>{
           console.log(config);
            //这里面可以做的事情
            //1、比如config中的一些信息不符合服务器的请求
            //2、比如每次发送网络请求时,都希望在界面中显示一个请求的图标
            //3、某些网络请求(比如登录(token)),必须携带一些特俗信息
            //
            //    
        },
        err=>{
		   console.log(err)
        }
    );
    //2.2、拦截响应
    instance.interceptors.response.use(
    	res =>{
            console.log(err);
            return res.data;
        },
        err=>{
            console.log(err)
        }
    );
    //3.发送真正的网络请求
    return instance(config)//create函数本身返回的是promise调用的时候。request可以直接.then.catch
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值