axios 是目前流行的Promise网络请求库,在浏览器端他通过 xhr方式创建ajax请求。在node环境下,通过 http 库创建网络请求。

axios 提供了丰富的配置,这里讲一讲我在工作中通常用到的基本配置方法。

因为我在工作中用 vue 进行开发,所以以下代码默认的环境是 vue-cli

创建一个 axios 实例

为什么要创建一个 axios 实例,而不是在 axios 对象上进行配置呢?是因为我们会应对复杂的使用场景,多个实例便于管理。

const isDev = process.env.NODE_ENV === 'development';

const instance = axios.create({
// baseURL是在proxyTable中会转发的配置,通过环境变量的判断,可以在开发和生产环境使用不同的url进行请求
baseURL: isDev ? '/fakeapi' : '/api',
timeout: 5000, validateStatus(status) {
// 一般来说,http status为200-300之间时,均判定为请求通过,你可以在这里修改这个配置(不建议修改)
return status === 200
},
headers: {
// 定义 post 请求编码格式
post: {
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'
}
}
});

处理请求参数

虽然对请求设置了编码格式,但是还是需要进一步设置具体的编码格式,比如我想进行一些特殊的设置。

qs.stringify 这里的参数请参考这篇文章 qs.js - 更好的处理url参数

import Qs from 'qs';

instance.interceptors.request.use(config => {
// 也可以在这里给请求添加token之类的字段
config.data = Qs.stringify(config.data, {arrayFormat: 'repeat', allowDots: true});
return config;
}, err => {
return Promise.reject(err);
});

处理返回值

import httpErrorHandler from './httpErrorHandler.js';

instance.interceptors.response.use(function(data) {
// 这里可以对返回数据进行处理,比如验证code是否为1等
return data.data;
}, httpErrorHandler)

httpErrorHandler.js 代码

# httpErrorHandler.js

export default (error) => {
if (!error.response) {
return Promise.reject({
msg: '网络连接超时',
error
});
}; let msg = '';
const status = error.response.status; switch (status) {
case 400:
msg = '错误的请求参数';
break;
case 401:
msg = '没有该操作权限';
break;
case 403:
msg = '请登录';
break;
case 404:
msg = '错误的请求地址';
break;
case 500:
case 501:
case 502:
case 503:
case 504:
msg = '服务器错误';
break;
default:
msg = '未知错误' + status;
}
return Promise.reject({
msg,
error
});
}

封装 get 方法

jquery.ajax 不同,axios的get方式需要通过 prarms 而不是 data参数传递:

/**
* 封装后的axios get方法
*
* @param {string} url 请求路径
* @param {object} option 请求参数
* @param {object} [config] 特殊配置项(选填)
* @returns
*/
export function get(url, option, config = {}) {
return instance.get(url, { params: option }, config)
} // 调用get
get('http://baidu.com', {
a: 1,
b: 2
})
.then(...)
.catch(...)

post 方式

post请求方式则要简单一些,不需要使用 prarms 参数

/**
* 封装后的axios post方法
*
* @param {string} url 请求路径
* @param {object} option 请求参数
* @param {object} [config] 特殊配置项(选填)
* @returns
*/
export function get(url, option, config = {}) {
return instance.get(url, option, config)
} // 调用post
post('http://baidu.com', {
a: 1,
b: 2
})
.then(...)
.catch(...)

upload 文件

上传文件需要使用不同的header设置和编码方式,所以需要创建一个单独的实例

const uploadInstance = axios.create({
baseURL: isDev ? '/fakeapi' : '/api',
timeout: 15000,
headers: {
// 发送文件需要的编码格式
'Content-Type': 'multipart/form-data'
}
}); /**
* 封装后的axios upload方法
*
* @param {string} url 请求路径
* @param {object} option 请求参数
* @param {object} [config] 特殊配置项(选填)
* @returns
*/
export function get(url, option, config = {}) {
let formdata = new FormData();
Object.keys(option).forEach(key=>{
formdata.append(key, option[key])
})
return uploadInstance.post(url, formdata, config)
} # 使用上传
let data = {
a: 1,
image: input.files[0],
}
let config = {
onUploadProgress(progressEvent) {
// 展示上传进度等
}
} upload('http://baidu.com', data, config)

axios封装(一)基础配置的更多相关文章

  1. StackExchange.Redis帮助类解决方案RedisRepository封装(基础配置)

    本文版权归博客园和作者吴双本人共同所有,转载和爬虫,请注明原文地址.http://www.cnblogs.com/tdws/p/5815735.html 写在前面 这不是教程,分享而已,也欢迎园友们多 ...

  2. 路由器基础配置之ppp封装下的pap,chap认证

    我们将以上面的拓扑图完成本次实验,路由器的默认封装为HDLC,要求为把路由器全被更改为ppp封装,并在router3与router4之间用pap认证,在router4与router5之间用chap认证 ...

  3. 把axios封装为vue插件使用

    前言 自从Vue2.0推荐大家使用 axios 开始,axios 被越来越多的人所了解.使用axios发起一个请求对大家来说是比较简单的事情,但是axios没有进行封装复用,项目越来越大,引起的代码冗 ...

  4. 使用Typescript重构axios(五)——实现基础功能:处理请求的header

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  5. vue2.0+webpack+vuerouter+vuex+axios构建项目基础

    前言 本文讲解的是vue2.0+webpack+vuerouter+vuex+axios构建项目基础 步骤 1.全局安装webpack,命令 npm install webpack -g 注意,web ...

  6. axios封装

    前言 作为出入vue的小萌新,我在写请求的时候,也是毫不犹豫写了ajax,结果肯定是不行的... Vue 原本有一个官方推荐的 ajax 插件 vue-resource,但是自从 Vue 更新到 2. ...

  7. vue2.0 axios封装、vuex介绍

    一.前言 博主也是vue道路上的行者,道行不深,希望自己的东西能对大家有所帮助.这篇博客针对 了解过vue基础,但是没有做过vue项目的童鞋.如果想看基础指令,可以看我之前的一篇博客,请点击  跳转, ...

  8. 1 - django-介绍-MTV-命令-基础配置-admin

    目录 1 什么是web框架 2 WSGI 3 MVC与MTV模式 3.1 MVC框架 3.2 MTV框架 3.3 区别 4 django介绍 4.1 Django处理顺序 4.2 创建django站点 ...

  9. vue项目搭建 (二) axios 封装篇

    vue项目搭建 (二) axios 封装篇 项目布局 vue-cli构建初始项目后,在src中进行增删修改 // 此处是模仿github上 bailicangdu 的 ├── src | ├── ap ...

随机推荐

  1. 通过nat让内网机器上网

    让内网机器访问不通机房的机器,架构如下 (172.16.10.5)  ----- (172.17.9.109 可以出外网,开启路由转发)  -------  (内网 192.168.36.19 能pi ...

  2. Linux mysql 5.5.10 二进制安装过程记录和 修改 密码 登录

    1.useradd clouder2.解压缩mysql.tar.bz2到/home/clouder2.mv /etc/my.cnf /etc/my.cnf.bak3./home/clouder/mys ...

  3. 修改jupyter notebook的默认路径

    我的系统环境是win10,安装了anaconda3 for python 3.6.6首先需要配置notebook的变量环境:打开 cmd 输入命令 jupyter notebook --generat ...

  4. ES6读书笔记(三)

    前言 前段时间整理了ES6的读书笔记:<ES6读书笔记(一)>,<ES6读书笔记(二)>,现在为第三篇,本篇内容包括: 一.Promise 二.Iterator和for of循 ...

  5. oracle基础知识过一遍(原创)

    用户.角色.权限.表空间 create tablespace test1_tablespace datafile ‘test1file.dbf’ size 10m; create temporary  ...

  6. pt-archiver数据归档

    可以使用percona-toolkit包中的pt-archiver工具来进行历史数据归档 pt-archiver使用的场景: 1.清理线上过期数据. 2.清理过期数据,并把数据归档到本地归档表中,或者 ...

  7. 浅谈nodejs中HTTP模块应用

    这里给大家分享下后端人员如果利用nodejs对数据的一些处理情况  适用于初学者使用 大牛勿喷 给大家分享下主要后端思想部分代码,前端部分就不展示了 const http = require(&quo ...

  8. react脚手架环境搭建流程

    1.安装与配置node.js:1.1软件下载地址:https://nodejs.org/en/,推荐下载.msi文件,其中npm已经集成在了node.js中.1.2 双击下载的.msi文件进行安装,安 ...

  9. 使用jenkins中遇到的问题汇总/持续更新

    jenkins产生大量日志文件 question: [DNSQuestion@1446063419 type: TYPE_IGNORE index 0, class: CLASS_UNKNOWN in ...

  10. Python学习 :面向对象(一)

    面向对象 一.定义 面向对象:面向对象为类和对象之间的应用 class + 类名: #在类中的函数称作 “方法“ def + 方法名(self,arg): #方法中第一个参数必须是 self prin ...