Axios基本在Vue3使用
1. 安装
npm install axios
2. 注册
main.js
import { createApp } from 'vue'
import App from './App.vue'
import router from './router.js'
import * as ElementPlusIconsVue from '@element-plus/icons-vue'
import axios from 'axios'
import './assets/main.css'
const app = createApp(App)
app.config.unwrapInjectedRef = true
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
app.component(key, component)
}
app.use(router,axios)
app.mount('#app')
3. 配置中间拦截器
在src目录下创建utils文件夹, 在文件夹下创建request.js文件
import axios from 'axios'
import { ElNotification, ElMessageBox } from 'element-plus'
import { h } from 'vue'
// axios实例
const request = axios.create({
// base地址 (调用在.env文件中设置的环境变量)
baseURL: import.meta.env.VITE_BASE_URL,
// 默认请求头
headers: {
'Content-Type': 'application/json;charset=utf-8',
},
// 超时时间
timeout: 10000,
// 允许携带cookie
withCredentials: true,
})
// 请求拦截器
request.interceptors.request.use((config) => {
// 在发送请求前做什么
// config.headers.Authorization = 'Bearer ' + window.localStorage.getItem('access')
// console.log(config.headers)
return config
}, (error) => {
// 请求错误做什么
return Promise.reject(error)
})
// 响应连接器
request.interceptors.response.use((response) => {
// 对响应数据做什么
// 1. data 正常响应时的数据(json格式)
// 2. status 正常响应的状态码(int格式)
const res = response.data
console.log('正常响应:', response.status)
return res
}, (error) => {
// 响应错误做什么
// 异常响应
// 1. status为响应码(int)
// 2. data为响应数据(json)
// 2.1 data.detail 异常响应的描述(str)
// 2.2 data.messages 异常响应的内容信息(list列表)
// 3. statusText为响应码队员的描述(str)
// var status;
// if (status) {
// status = 0
// if (error.response) {
// const response = error.response
// if (response) {
// console.log("异常response.data.detail:描述", response.data.detail);
// console.log("异常response.data.detail:状态码", response.status);
// console.log("异常response.data.detail:状态描述", response.statusText);
// if ((response.data.code === 'token_not_valid') && (response.data.messages)) {
// // status = 401 验证过期
// ElNotification({
// title: 'User',
// message: h('a', { href: '/login/' + '?next=' + location.pathname }, `${response.status}:${response.data.messages}`),
// type: 'info'
// })
// }
// }
// }
// }
// status = 1
return Promise.reject(error)
})
export default request
4. 创建api封装
在src文件夹下创建, api文件夹, 创建文件xxxx.js 例如: articles.js登陆api
import request from "../utils/request.js";
// 笔记(文章)api
// 文章的请求
// 1. 传入字典config
// 例: config = reactive({
// url: '',
// method: '',
// data: xxx,
// })
const article_url = '/article/'
const requestArticleList = (config) => {
return request({
url: article_url,
method: 'get',
data: config.data,
params: config.params,
})
}
const requestArticleDetail = (config) => {
return request({
url: article_url + config.id + '/',
method: 'get',
data: config.data,
params: config.params,
})
}
const requestArticlePost = (config) => {
return request({
url: article_url,
method: 'post',
data: config.data,
params: config.params,
})
}
const requestArticlePut = (config) => {
return request({
url: article_url + config.id + '/',
method: 'put',
data: config.data,
params: config.params,
})
}
const requestArticleDelete = (config) => {
return request({
url: article_url + config.id + '/',
method: 'delete',
data: config.data,
params: config.params,
})
}
const requestArticle = (config) => {
return request({
url: config.url,
method: config.method
})
}
export default { requestArticle, requestArticleDetail, requestArticleList, requestArticlePost, requestArticlePut, requestArticleDelete }
5. 使用
<script>
import { ref, reactive, onMounted } from 'vue'
import requestArticles from '../api/article'
export default {
setup() {
...
// 请求<笔记本>数据 1. id 2. title 3. user 4. notebook
const notebooks_data = ref({})
const get_notebooks = (id) => {
requestNoteBooks.requestNoteBooksList({})
.then(res => {
notebooks_data.value = res
// console.log(notebooks_data.value);
})
.catch(err => {
console.log(err);
})
}
}
}