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

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

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

创建一个 axios 实例

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

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

处理请求参数

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

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

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

处理返回值

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

httpErrorHandler.js 代码

  1. # httpErrorHandler.js
  2. export default (error) => {
  3. if (!error.response) {
  4. return Promise.reject({
  5. msg: '网络连接超时',
  6. error
  7. });
  8. };
  9. let msg = '';
  10. const status = error.response.status;
  11. switch (status) {
  12. case 400:
  13. msg = '错误的请求参数';
  14. break;
  15. case 401:
  16. msg = '没有该操作权限';
  17. break;
  18. case 403:
  19. msg = '请登录';
  20. break;
  21. case 404:
  22. msg = '错误的请求地址';
  23. break;
  24. case 500:
  25. case 501:
  26. case 502:
  27. case 503:
  28. case 504:
  29. msg = '服务器错误';
  30. break;
  31. default:
  32. msg = '未知错误' + status;
  33. }
  34. return Promise.reject({
  35. msg,
  36. error
  37. });
  38. }

封装 get 方法

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

  1. /**
  2. * 封装后的axios get方法
  3. *
  4. * @param {string} url 请求路径
  5. * @param {object} option 请求参数
  6. * @param {object} [config] 特殊配置项(选填)
  7. * @returns
  8. */
  9. export function get(url, option, config = {}) {
  10. return instance.get(url, { params: option }, config)
  11. }
  12. // 调用get
  13. get('http://baidu.com', {
  14. a: 1,
  15. b: 2
  16. })
  17. .then(...)
  18. .catch(...)

post 方式

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

  1. /**
  2. * 封装后的axios post方法
  3. *
  4. * @param {string} url 请求路径
  5. * @param {object} option 请求参数
  6. * @param {object} [config] 特殊配置项(选填)
  7. * @returns
  8. */
  9. export function get(url, option, config = {}) {
  10. return instance.get(url, option, config)
  11. }
  12. // 调用post
  13. post('http://baidu.com', {
  14. a: 1,
  15. b: 2
  16. })
  17. .then(...)
  18. .catch(...)

upload 文件

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

  1. const uploadInstance = axios.create({
  2. baseURL: isDev ? '/fakeapi' : '/api',
  3. timeout: 15000,
  4. headers: {
  5. // 发送文件需要的编码格式
  6. 'Content-Type': 'multipart/form-data'
  7. }
  8. });
  9. /**
  10. * 封装后的axios upload方法
  11. *
  12. * @param {string} url 请求路径
  13. * @param {object} option 请求参数
  14. * @param {object} [config] 特殊配置项(选填)
  15. * @returns
  16. */
  17. export function get(url, option, config = {}) {
  18. let formdata = new FormData();
  19. Object.keys(option).forEach(key=>{
  20. formdata.append(key, option[key])
  21. })
  22. return uploadInstance.post(url, formdata, config)
  23. }
  24. # 使用上传
  25. let data = {
  26. a: 1,
  27. image: input.files[0],
  28. }
  29. let config = {
  30. onUploadProgress(progressEvent) {
  31. // 展示上传进度等
  32. }
  33. }
  34. 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. sqoop2启动client异常

    java环境:  java version "10.0.1" ,启动sqoop-shell端或者是sqoop-client端异常,异常如下: [root@hadoop1 home] ...

  2. jFinal 2.2入门学习之一:搭建框架输出helloword

    官方推荐用Eclipse IDE for Java EE Developers 做为开发环境 1.创建 Dynamic Web Project 2.修改 Default Output Folder,推 ...

  3. Reading Software Defined Traffic Measurement with OpenSketch

    NSDI '13 概要 OpenSketch是一个通用的.抽象的测量框架, 与SDN 网络架构类似, OpenSketch 提出将测量控制层和数据层解耦. 数据层运行设为可动态配置的3阶段流水线, 首 ...

  4. 【问题解决】增加https后 phpcms 分页错误

    https://m.cnbuses.com/m.cnbuses.com/index.php?page=2查看分页方法 function pages()中有个pageurl 查看该方法,发现有类似htt ...

  5. RedirectAttributes 之 IE8请求跳转失败

    1.时间真快,一晃又快冬天了,下了第一场雪.雪花漫漫,堵车悠悠. 2.这次遇到这样一个问题,就是RedirectAttributes传递数据参数,如果参数数据过大,在IE8浏览器时候会跳转不过去.其实 ...

  6. Python中级 —— 06SMTP发送电子邮件

    Email的历史比Web还要久远,直到现在,Email也是互联网上应用非常广泛的服务.(未完)

  7. vs code 修改文件的缩进

    百度这个问题的都是强迫症患者. 前人代码是2个空格缩进,我习惯3个, step1:打开  文件 —>  首选项 —> 设置,进入用户设置 step2:设置缩进量,(加两句代码) step3 ...

  8. windows7平台 nginx+python 环境搭建

    参考了这篇文章,感谢原文作者:https://blog.csdn.net/foxgod/article/details/78929201 最近正在学习Python,发现除了写一点py脚本在idlex上 ...

  9. PhpStorm中无法用post提交的解决方案

    这是一个简单的计算器,html页面: <!DOCTYPE html> <html lang="en"> <head> <meta char ...

  10. Hadoop源码学习笔记之NameNode启动场景流程五:磁盘空间检查及安全模式检查

    本篇内容关注NameNode启动之前,active状态和standby状态的一些后台服务及准备工作,即源码里的CommonServices.主要包括磁盘空间检查. 可用资源检查.安全模式等.依然分为三 ...