axios的基本使用

126 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天

axios

安装:

npm install axios --save

引入:

import axios from 'axios'

使用:

//axios方法返回一个promise对象
axios({
  url: 'http://123.207.32.32:8000/home/multidata',
  method: 'post'//指定请求方式,默认为get
}).then(res => {
  console.log(res);
})
​
//指定请求方式还可以这么写👇
axios.post({})
​
//传参,会自动拼接为->http://123.207.32.32:8000/home/data?type=pop&page=1
axios({
  url: 'http://123.207.32.32:8000/home/data',
  params: {
      type: 'pop',
      page: 1
  }
}).then(res => {
  console.log(res);
})
​
//发送并发请求,返回的res就是一个包含所有请求对象的对象数组
axios.all([axios(), axios()]).then(res => {
    //dosth
})
​
//使用spread将数组展开,这样就不用再通过下标获取返回的对象
axios.all([axios(), axios()]).then(axios.spread((res1, res2) => {
    //dosth
}))
​

配置:

//对路径进行抽取
axios.defaults.baseURL = '123.207.32.32:8000'//基础域名
axios.defaults.timeout = 5000//响应时限(ms)
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';//

常见的配置选项:

  • url
  • method:' '//请求类型
  • baseURL //请求根路径
  • transformRequest: [function(data){}] //请求前的数据处理
  • transformResponse:[function(data){}] //请求后的数据处理
  • headers:{'x`Requested-With':'XMLHttpRequest'}//自定义的请求头
  • params:{} //URL查询对象
  • paramsSerilizer: function(params){} //查询对象序列化函数
  • data: {key: '111'} //request body
  • timeout: 1000//超时设置(ms)
  • withCredentials: false //跨域是否带Token
  • adapter: function(resolve, reject, config){}//自定义请求处理
  • auth: {uname:'',pwd:''} //身份验证信息
  • responseType: 'json' //响应的数据格式
axios实例

在上面示例中,我们用到的是全局axios,但在实际开发中,我们要请求的baseURL以及其他配置并不一定一致,所以我们需要创建axios的实例使用

const instance1 = axios.create({
    baseURL: 'http://balabalabala',
    timeout: 5000
})
//使用实例发送请求
instance1({
    url:'/foo',
    params: {
        bar: 'bar'
    }
}).then(res => {
    //dosth
})
模块封装

为了减少我们项目对axios框架的依赖,以便在框架停止维护时能更方便地更换框架,我们将axios封装至我们自定义地模块,在每个需要请求的组件中调用我们的自定义模块

//封装至network/request.jsimport Axios from "axios";
​
export function request(config) {
        //创建axios实例
        const instance = Axios.create({
            baseURL: 'http://balablabalaba.com',
            timeout: 5000
        })
        //发送网络请求
        return instance(config);//instance返回的就是一个Promise实例
}
​
//使用模块
import { request } from './network/request'request('/home').
then((res)=>console.log(res)).
catch(err => console.log(err))
拦截器
//在模块中
import Axios from "axios";
​
export function request(config) {
        //创建axios实例
        const instance = Axios.create({
            baseURL: 'http://balablabalaba.com',
            timeout: 5000
        })
        
        //拦截器,参数两个函数,一个为成功,一个为失败,成功则返回拦截的配置信息(config),失败则返回错误信息
        
        //请求拦截
        instance.interceptors.request.use(config => {
            console.log(config);
            return config
        }, err => {
            console.log(err);
        })
    
        //响应拦截
        instance.interceptors.response.use(res => {
            console.log(res);
            //res中只有data部分是我们请求的数据
            return res.data;
        }, err => {
            console.log(err);
        })
        
        //发送网络请求
        return instance(config);//instance返回的就是一个Promise实例
}

拦截的应用场景举例:

  1. 判断config信息是否符合服务器要求
  2. 发送网络请求时,希望在界面中显示一个请求的图标
  3. 某些网络请求(比如登录(token)),必须携带一些特殊的信息
  4. 等等

个人认为:但前端数据用户可做改动,所以后端验证还是必不可少,前端验证只是减轻后端压力