文档:Axios 中文文档 | Axios 中文网 | Axios 是一个基于 promise 的网络请求库,可以用于浏览器和 node.js
概念:axios是一个基于Promise的网络请求库,可以用于浏览器和node.js
特点:
使用简单,包尺寸小且提供了易于扩展的接口
axios封装了XMLHttpRequest对象
支持Promise的API
可以配置拦截器来实现请求的拦截和响应拦截
自动转换JSON数据
取消请求
批量请求
npm下载方式
npm install axios
CDN方式
axios({
method:'请求方式',
url:'请求的url',
params:{
//参数
}
})
axios的POST的语法
axios({
method:'POST',
url:'请求的地址',
data:{
//参数
}
})
axios({
method:'DELETE'
url:'请求的地址',
data:{
//参数
}
})
4、
axios({
method:'PUT'
url:'请求的地址',
data:{
//参数
}
})
GET方式
axios.get('请求的路径',{
params:{
//参数
}
})
POST方式
axios.post('请求的路径',{
//参数
})
DELETE方式
axios.delete('请求的路径',{
data:{
//参数
}
})
PUT方式
axios.put('请求的路径',{
//参数
})
图片上传
文件上传
{{progress}}%
在axios中一次可以发送多个请求
import axios from 'axios'
export default {
methods:{
async batchRequest(){
let result=await axios.all([
axios.get('http://www.zhaijizhe.cn:3005/students/getStudents'),
axios.get('http://www.zhaijizhe.cn:3005/classes/getClasses'),
axios.get('http://www.zhaijizhe.cn:3005/directors/getDirectors')
])
console.log(result);
}
}
}
假设一种场景就是我们一个前端项目可能向多个后端发送请求,就需要多个axios实例,可以使用create方法为axios创建一个新实例,这个实例功能叫axios原本这个实例,功能没有原本axios强大
axios的create方法的使用
在实际开发场景我们将开发环境分为三种场景
开发环境:所谓的开发环境是指程序员在开发阶段所使用的环境称为开发环境
测试环境:程序在测试阶段使用使用的环境被称为测试环境
生产环境:程序上线部署的环境
在配置环境,在启动的时候输入不同的命令启动不同的环境
实验:分别由三套环境 开发环境: http://localhost:3005
测试环境: http://47.98.128.191
生产环境: Express
进入到package.json中配置启动脚本
"scripts": {
"serve": "vue-cli-service serve",
"production":"set NODE_ENV=production&vue-cli-service serve",
"build": "vue-cli-service build"
},
在src目录下创建api目录,在该目录下创建request.js文件,具体的代码如下
import axios from 'axios'
//根据启动命令来决定目前使用什么环境
function getBaseURL(){
switch(process.env.NODE_ENV){
case 'production':
return "http://www.zhaijizhe.cn:3005"
default:
return "http://47.98.128.191:3000"
}
}
const service=axios.create({
baseURL:getBaseURL()
})
export default service
axios的拦截器分为请求拦截器和响应拦截器
请求拦截器常见的操作就是携带token,如果再发送请求的时候给每一个请求携带token到请求头之中会比较麻烦
//设置请求拦截器
service.interceptors.request.use(config=>{
//设置请求拦截器
//携带token信息
config.headers['Authorization']="Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI2MGNiMDA3M2I4NGRjNWVlZGUwOWRkNzkiLCJpYXQiOjE2Njk3MTU1OTcsImV4cCI6MTY2OTcxNzM5N30.g3T5hj75XfaLhYRiNeib-aud-5X_Yw-oc9WsDbZb7TQ"
return config
})
配置响应拦截器
service.interceptors.response.use(response=>{
console.log('-----------正常进到响应拦截器里了--------------');
console.log('response',response);
//如果要将数据从响应拦截器返回到发送请求的回调中,需要使用return将这个返回对象返回
return response.data
},err=>{
if(err.response){
switch(err.response.status){
case 401:
alert('您的token已经失效,请重新登录')
break;
case 404:
alert('您输入的地址有误,请检查您的URL地址')
break;
case 500:
alert('您的服务器有误,请与管理员联系')
break
}
}else if(!window.navigator.onLine){
alert('您的网络已断开,请检查')
}
})
|-src
|-api
|-modules
|-users.js:完成所有关于用户模块的网络请求的api
|-classes.js:完成所有关于班级模块的网络请求的api
|-...
|-api.js:对所有模块进行汇总的js
|-request.js:axios二次封装后的网络请求库
import request from '@/api/request'
//获取所有班主任的信息
const getDirectors=(params)=>{
return request({
method:'GET',
url:'/directors/getDirectors',
params
})
}
//获取所有班主任信息的简写形式
//const getDirectors1=()=>request.get('/directors/getDirectors',{params})
//新增班主任的信息
const addDirector=(data)=>{
return request({
method:'POST',
url:'/directors/addDirectors',
data
})
}
//删除班主任信息
const deleteDirector=(_id)=>{
return request({
method:'DELETE',
url:'/directors/deleteDirectors',
data:{_id}
})
}
//修改班主任信息
const updateDirectors=(data)=>{
return request({
method:'PUT',
url:'/directors/updateDirectors',
data
})
}
export default {
getDirectors,
addDirector,
deleteDirector,
updateDirectors
}
import directors from "./modules/directors";
export default{
directors
}
import api from '@/api/api'
//将api挂载到Vue的原型上
Vue.prototype.$api=api
async getDirectors(){
const result=await this.$api.directors.getDirectors(this.query)
this.list=result.data.result
}
Content-Type
application/x-www-form-urlencode
application/json:(axios默认的方式)
application/multipart/form-data
如何将JSON数据变成表单格式的数据,方式有两种
如果少量的接口可以使用:qs.stringify()
如果整个项目都是表单格式:可以配置拦截器
下载qs依赖包
npm i qs
通过qs的stringify方法来进行转换
import request from '@/api/request'
import qs from 'qs'
const login=(data)=>{
return request({
method:'POST',
url:'/login',
data:qs.stringify(data)
})
}
export default{
login
}
注意:如果整个项目都是表单格式的数据,使用此方法会每次都要转换开发效率较低
service.interceptors.request.use(config=>{
config.headers['Content-Type']="application/x-www-form-urlencoded"
return config
})
Fetch被称为下一代Ajax技术,内部采用Promise方式来处理数据
FethAPI主要有如下特点
API语法更加简洁
采用模块化设计,API分散到多个对象中
采用Promise方式处理数据,避免回调地狱
axios和fetch的不同
1、axios底层依然是XMLHttpRequest方式,但是fetch的通讯类型是新的类型称为fetch
2、axios实际上是封装XMLHttpRequest方法,使用的时候必须要下载axios的依赖库,然后才能使用,但是fetch是js的原生提供的,不需要导入新的依赖包
3、发送请求的参数为body,而且还要程序员自己将json对象转成JSON字符串
总结: fetch和axios比较起来无任何优势。
fetch(url).then(...).catch(...)
1)获取所有学生列表信息
created(){
fetch("http://www.zhaijizhe.cn:3005/students/getStudents").then(res=>{
return res.json()
}).then(res=>{
this.students=res.data.result
}).catch(err=>{
console.log(err);
})
}
使用async/await的方式编写
methods:{
async getStudentsData(){
let res=await fetch('http://www.zhaijizhe.cn:3005/students/getStudents')
let {data:{result}}=await res.json()
this.students=result
}
},
created(){
this.getStudentsData()
}
2)根据用户名称获取用户信息
methods:{
async getStudentsData(){
let res=await fetch('http://www.zhaijizhe.cn:3005/students/getStudents?type=name&value=郭佳俊')
let {data:{result}}=await res.json()
console.log(result);
this.students=result
}
},
created(){
this.getStudentsData()
}
export default {
data(){
return{
student:{
name:'zhaijizhe',
age:38,
gender:'男',
imagePath:'http://www.zhaijizhe.cn:3005/images/1662264356815.webp',
subjectsId:'60bf18ce9efaab9c2327c982',
classesId:'60bf18fc9efaab9c2327c988'
}
}
},
methods:{
async addStudent(){
let res=await fetch('http://www.zhaijizhe.cn:3005/students/addStudents',{
method:'post',
headers:{
'Content-Type':'application/json'
},
body:JSON.stringify(this.student)
})
let result=await res.json()
console.log(result);
}
}
}