vue中axios的介绍

vue中axios的介绍

一、axiox介绍

1、Axios特性

支持Promise API

拦截请求和响应

转换请求数据和响应数据

取消请求

自动转换JSON数据

客户端支持防御XSRF

2、Axios浏览器支持

二、基础用法(get、post、put等请求方法)

axios的请求方法:get、post、put、patch、delete(常用的五种)

get:获取数据

post:提交数据(表单提交+文件上传)

put:更新数据(所有数据推送到后端)

patch:更新数据(只将修改的数据推送给后端)

delete:删除数据

1、get:获取数据

写法一:

//http://localhost:8080/data.json?id=12

axios.get('/data.json',{

params:{

id:12

}

}).then((res){

console.log(res)

})

写法二

axios({

method:'get',

url:'/data.json',

params:{

id:12

}

}).then(res =>{

console.log(res)

})

2、post:提交数据(表单提交+文件上传)

写法一:

let data = {

id:12

}

axios.post('/post',data).then(res =>{

console.log('res)

})

写法二:

axios({

method:'post',

url:'/post',

data:data

}).then(res=>{

console.log(res)

})

数据是JSON的形式

form-data请求

let formdata = new FormData()

for(let key in data){

formdata.append(key,data[key])

}

axios.post("/post",formData).then(res =>{

console.log('res')

})

数据的形式

3、put:更新数据(所有数据推送到后端)

同get和post

put与post几乎一样,只是method不一样

4、patch:更新数据(只将修改的数据推送给后端)

同get和post

5、delete:删除数据

写法一

axios.delete('/delete',{

params:{

id:12

}

}).then(res =>{

console.log(res)

})

axios.delete('/delete',{

data:{

id:12

}

}).then(res =>{

console.log(res)

})

写法二

axios({

method:'delete',

url:'/delete',

params:{},

data:{}

}).then(res => {

console.log(res)

})

什么是并发请求?

并发请求:同时进行多个请求,并统一处理

请求的方法:

axios.all()

axios.spread()

axios.all(

[

axios.get('/data.json‘),

axios.get('/city.json‘),

]

).then(

axios.spread((dataRes,cityRes) => {

console.log(dataRes,cityRes)

})

)

三、进阶用法(实例、配置、拦截器、取消请求等)

1、创建axios实例

当后端接口地址有多个,并且超时时长不一样时可以创建一个axios实例

let instance = axios.create({

baseURL:'http://localhost:8080',

timeout:1000

})

let axios2= axios.create({

baseURL:'http://localhost:9090',

timeout:5000

})

instance.get('/data.json').then(res =>{

console.log(res)

})

axios2.get('/city.json').then(res =>{

console.log(res)

})

2、实例的相关配置

axios的配置:

axios.create({

baseURL:'', //请求的域名,基本地址

timeout:1000, //超时时长(ms)

url:'/data.json' , //请求路径

method:’get‘ , //请求方法 get/post/pu/patch/delete

headers:{ //请求头

token:' '

},

params:{}, //请求参数拼接在url上

data:{}, //请求参数放在请求体

})

axios.get('/data.json',{

params:{

id:12

}

})

axios.get('/data.json',{}),有两个参数,第二个参数就是写axios实例的相关配置的

axios全局配置

axios实例配置

axios请求配置

1、axios全局配置

axios.defaulte.timeout = 1000

axios.defaulte.baseURL = 'http://localhost:8080'

一般全局配置都只是修改这两个参数

2、axios实例配置

let instance = axios.create()

instance.defaults.timeout = 3000

3、请求配置

instance.get('data.json',{

timeout:5000

})

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

3、在实际开发中

实例1:

有两种请求接口:http:localhost:9090 、http:localhost:9091

let instance = axios.create({

baseURL:'http:localhost:9090',

timeout:1000

})

let instance1 = axios.create({

baseURL:'http:localhost:9091',

timeout:3000

})

instance.get('/contactList',{

params:{ id:12 }

}).then((res) =>{

console.log(res)

})//此实例应用到了baseURL,timeout,url,method,params

实例2:

只有一个方法的数据量很大时,修改此方法的超时时长

instance1.get('/contactList',{

timeout:5000

}).then((res) =>{

console.log(res)

})

//此实例应用到了baseURL、timeout:5000、method、url

4、拦截器

拦截器: 在请求或响应被处理前拦截它们

请求拦截器

响应拦截器

请求拦截器

axios.interceptors.request.use

(config =>{

//在发送请求前做些什么

return config

}) ,err=>{

//在请求错误的时候做些什么

return Promise.reject(err)

}

响应拦截器

axios.interceptors.response.use

(res =>{

//请求成功对响应数据作处理

return res //这里的res返回后是axios.get().then(res=>{})中的res

}),errr=>{

//响应错误做写什么

return Promise.reject(err) //这里的err返回后是axios.get().then().catch(err =>{})中的err

}

取消拦截器(了解,一般情况下不会取消拦截器的)

let interceptors = axios.interceptors.request.use

(config =>{

config.headers= {

auth:true

}

return config

})

axios.interceptors.request.eject(interceptors)

5、错误处理

axios.get('/data.json').then((res) =>{

console.log(res)

}).catch(err =>{

console.log(err)

})

实例:实际开发过程中,一般添加统一错误处理

错误处理---请求拦截器

let instance = axios.create({})

instance.interceptors.request(config =>{

return config

},err=>{

//一般请求错误http状态码以4开头,常见:401 超时;404 not found

$('#modal').show()

setTimeout(() =>{

$('#modal').hide()

},200)

return Promise.reject(err)

})

错误处理---响应拦截器

instance.interceptors.response.use(res =>{

return res

},err=>{

//一般响应错误http状态码以5开头,常见:500 系统错误;502系统重启

$('#modal').show()

setTimeout(() =>{

$('#modal').hide()

},200)

return Promise.reject(err)

})

取消请求(了解,几乎用不到)

四、axios进一步封装,在项目中的实际应用

axios的封装(重点)

统一管理url

对请求统一的封装

一、新建文件 /service/contactApi.js

const CONTACT_API = {

//例子:获取联系人列表

getContactList:{

method:'get',

url:'/contactList'

}

//例子:新建联系人 from-data

newContactForm:{

method:'post',

url:'/contact/new/form'

}

//例子:新建联系人 application/json

newContactJson:{

method:'post',

url:'/contact/new/json'

}

//例子:编辑联系人

editContact:{

method:'put',

url:'/contact/edit'

}

//例子:删除联系人

deleteContact:{

method:'delete',

url:'/contact'

}

export default CONTACT_API

二、封装axios,新建/service/http.js

import axios from 'axios'

import service from './contactApi'

import Toast from 'Vant'

//service循环遍历输出不同的请求方法

let instance = axios.create({

baseURL:'http://localhost:9000/api',

timeout:1000

})

const Http = {} //包裹请求方法的容器

//请求格式/参数的统一

for(let key in service){ //这里的key代表的是newContactJson,editContact等

let api = service[key]; //url method

//async作用:避免进入回调地狱

Http[key] = async function(

params, //请求参数 get:url,put,post,patch(data), delete:url

isFormData = false, //标识是否是form-data请求

config={} //配置参数

){

let newParams = {}

//content-type是否是form-data的判断

if(params && isFormData){

newParams = new FormData()

for(let i in params){

newParams.append(i,params[i])

}

}else{

newParams = params

}

let response = {} //请求的返回值

//不同请求的判断

if(api.method === 'put' || api.method === 'post' || api.method === 'patch'){

try{

response = await instance[api.method](api.url,newParams,config)

}catch(err){

response = err

}

}else if(api.method === 'delete' || api.method === 'get'){

config.params = newParams

try{

response = await instance[api.method](api.url,config)

}catch(err){

response = err

}

}

return response; //返回请求的响应值

}

}

//拦截器的添加

//请求拦截器

instance.interceptorswx.request(config=>{

//发起请求前做些什么

Toast.loading({

mask:false,

duration:0, //一直存在

forbidClick:true,//禁止点击

message:'加载中...'

})

return config

},()=>{

//请求错误

Toast.clear()//清楚轻提示

Toast('请求错误,请稍后重试')

})

// 响应拦截器

instance.interceptors.response.use(res=>{

//请求成功

Toast.clear()

return res.data

},()=>{

//请求错误

Toast.clear()//清楚轻提示

Toast('请求错误,请稍后重试')

})

export default Http

三、调用Http

在main.js

import Http from './service/http'

//把Http挂载到Vue实例上

Vue.prototype.$Http = Http

四、使用接口

methods:{

// 查询

async getList(){

let res = await

this.$Http.getContactList()

this.list = res.data

}

五、扩展

相关推荐