Axios 小白从安装到基础的使用与封装

安装与使用

安装:
npm install --save axios
使用:
import axios from 'axios'

文章下附Giee地址

一、请求类型

get、delete方式类似都可以用params请求,delete可以在请求体中请求,post、put、patch类似都是使用请求体请求并且可以有json/form-data两种方式

GET

get请求的两种写法 (使用config 将参数放在params中)

    axios.get('/url', {
        params: {
            id: 12
        }
    }).then((res) => {
        console.log(res)
    })
    //另外一种写法
    axios({
        method: 'get',
        url: '/url',
        params: {
            id: 12
        }
    }).then(res => {
        console.log(res)
    })

POST

post请求 (将参数放在请求体中),两种方式json/form-data

// applicition/json
 let data = {
    id: 12
 }
 axios.post('/url', data).then(res => {
    console.log(res)
 })
 axios({
    method: 'post',
    url: '/post',
    data: data
 })
// form-data 表单提交(图片上传,文件上传)
    let formData = new FormData()
    for (let key in data) {
        formData.append(key, data[key])
    }
    axios.post('/url', formData).then(res => {
        console.log(res)
    })

PUT

put 请求 (将参数放在请求体中),两种方式json/form-data

    // put请求
    axios.put('/put',data).then(res=>{
        console.log(res)
    })

PATCH

patch请求 (将参数放在请求体中),两种方式json/form-data

    // patch请求
    axios.patch('/patch',data).then(res=>{
        console.log(res)
    })

DELETE

delete (将参数放在请求体中 也可以将参数放在params中)

// delete请求
axios.delete('/delete', {
    params: {
        id: 12
    }
})
axios.delete('/delete', {
    data: {
        id: 12
    }
})

二、并发请求

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

axios.all(
    [
        axios.get('/data.json'),
        axios.get('/city.json')
    ]
).then(
    axios.spread((dataRes, cityRes) => {
        console.log(dataRes, cityRes)
    })
)

三、axios实例

使用场景: 后端接口地址有多个,并且超时时长不一样或者业务逻辑不同

axios.create({
    baseURL: 'http://localhost:8080', // 请求的域名,基本地址
    timeout: 1000, // 请求超时时长(ms)
    url: '/data.json', //请求路径
    method: 'get,post,put,patch,delete', // 请求方法
    headers: {
        token: ''
    }, // 请求头
    params: {}, //请求参数拼接在url上
    data: {}, //请求参数放在请求体
})

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

    // 1.axios全局配置
    axios.defaults.timeout =1000
    axios.defaults.baseURL = 'http://localhost:8080'
    // 2.axios实例配置
    let instance = axios.create()
    instance.defaults.timeout = 3000
    // 3.axios请求配置
    instance.get('/data.json',{
        timeout:5000
    })

四、拦截器

拦截器:在请求或响应被处理前拦截他们
请求拦截器的用法

// 请求拦截器
 axios.interceptors.request.use(config => {
    // 在发送请求前做些什么
    return config
 }, err => {
    // 在请求错误的时候做些什么
    return Promise.reject(err)
 })

响应拦截器的用法

 // 响应拦截器
 axios.interceptors.response.use(res => {
    // 请求成功对响应数据做处理
    return res
 }, err => {
    // 响应错误做些什么
    return Promise.reject(err)
 })

取消拦截器

let interceptors = axios.interceptors.request.use(config => {
        config.headers = {
            auth: true
        }
        return config
    })
axios.interceptors.request.eject(interceptors)

五、错误处理与取消处理

错误处理:在拦截器中用err,如果某请求后面需要单独处理错误,则使用catch()

// 例子:实际开发过程中,一般添加统一错误处理
    let instance = axios.create({})
    instance.interceptors.request(config => {
        return config
    }, err => {
        // 请求错误 一般http状态码以4开头,常见:401超时,404 not found
        $('#modal').show()
        setTimeout(() => {
            $('#modal').hide()
        }, 2000)
        return Promise.reject(err)
    })
    instance.interceptors.response.use(res => {
        return res
    }, err => {
        // 响应错误处理 一般http状态码以5开头,500 系统错误,502, 系统重启
        $('#modal').show()
        setTimeout(() => {
            $('#modal').hide()
        }, 2000)
        return Promise.reject(err)
    })
    instance.get('/data.json').then(res=>{
        console.log(res)
    }).catch(err=>{
            //单独处理错误样式
        console.log(err)
    })

六、取消请求

用于取消正在进行的http请求

let source = axios.CancelToken.source()
axios.get('/data.json', {
    cancelToken: source.token
}).then(res => {
    console.log(res)
}).catch(err => {
        //取消请求后返回的messge信息
    console.log(err)
})

// 取消请求(message可选)
source.cancel('cancel http')

七、封装axios

// service 循环遍历输出不同的请求方法
let instance = axios.create({
    baseURL: 'http://localhost:9000/api',
    timeout: 1000
})
const Http = {}; // 包裹请求方法的容器

// 请求格式/参数的统一
for (let key in service) {
    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.interceptors.request.use(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('请求错误,请求稍后重试')
})

附:node后台接口服务

后台接口服务目录在gitee代码仓库根目录的axios_node下
如何启动?
进入axios_node目录,首先需要安装依赖npm install,依赖安装完成后输入node index.js启动服务

代码仓库地址 https://gitee.com/EverZc/VueAxios.git

如需文章上方axios X-Mind思维脑图文件,关注微信公众号:文靖撩知识 ,回复axios 即可领取。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267

推荐阅读更多精彩内容

  • axios 基于promise用于浏览器和node.js的http客户...
    蔡威大爷阅读 224评论 0 1
  • axios 基于 Promise 的 HTTP 请求客户端,可同时在浏览器和 node.js 中使用 功能特性 在...
    Yanghc阅读 3,583评论 0 7
  • 本周在做一个使用vuejs的前端项目,访问后端服务使用axios库,这里对照官方文档,简单记录下,也方便大家参考。...
    JadePeng阅读 11,081评论 1 59
  • 一、安装 1、 利用npm安装npm install axios --save 2、 利用bower安装bower...
    kiddings阅读 1,704评论 0 3
  • axios插件的使用操作 axios插件的使用操作 axios [图片上传失败...(image-744a97-1...
    魔仙堡杠把子灬阅读 2,987评论 0 1