前言

  我们知道 vue 2.0版本开始推荐使用 axios 来完成前端 ajax 请求,axios 是一个基于Promise 的 http 库,可以用在浏览器和 node.js 中,axios 成为vue全家桶的一个重要部分,对前后端接口请求起着必不可少的作用,本文主要总结一下 axios 的一些小知识点和项目中常见的需要封装的方法。

正文

  1.axios 是什么?

  axios 是一个基于 Promise 的 http 库,可以用于浏览器和 node.js 中,在浏览器中创建 XMLHttpRequest 对象(基于ajax的一种封装),然后调用该对象的一些方法实现对后端数据接口的请求,在 node.js 中用于创建 http 请求,支持 Promise Api,可以使用 async/await 语法糖书写,便于拦截请求和响应,并对请求和响应的数据进行处理,自动转换 JSON 数据格式,同事用于客户端支持防御 XSRF。且目前主流浏览器都支持该库。

  常见的安装方式有以下两种:

  (1)使用 cdn 方式,代码中直接引入下面脚本即可,这种方式适用于小型项目,比如学习的小 demo 等。

    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>

  (2)使用 npm 方式,直接在命令行中添加即可。

    npm install axios

  2.axios 常见用法?

  axios中常用的请求配置如下,只有指定的url是必须项,其他存在默认配置项,method不特殊指定,默认方法为 get 。

  {
  url: '/user',
  // `url` 是用于请求的服务器 URL
   method: 'get',
  // default `method` 是创建请求时使用的方法
   baseURL: 'https://some-domain.com/api/',
  // `baseURL` 将自动加在 `url` 前面,除非 `url` 是一个绝对 URL。它可以通过设置一个 `baseURL` 便于为 axios 实例的方法传递相对 URL
  headers: {'X-Requested-With': 'XMLHttpRequest'},
  // `headers` 是即将被发送的自定义请求头
  params: {
  ID: 12345
  },
  // 必须是一个无格式对象(plain object)或 URLSearchParams 对象,`params` 是即将与请求一起发送的 URL 参数
  timeout: 1000,
  // 如果请求话费了超过 `timeout` 的时间,请求将被中断,`timeout` 指定请求超时的毫秒数(0 表示无超时时间)
  withCredentials: false,
  // default `withCredentials` 表示跨域请求时是否需要使用凭证
   responseType: 'json',
  // default `responseType` 表示服务器响应的数据类型,可以是 'arraybuffer', 'blob', 'document', 'json', 'text', 'stream'
   responseEncoding: 'utf8', // default
  onUploadProgress: function (progressEvent) {
  // `onUploadProgress` 允许为上传处理进度事件
  // Do whatever you want with the native progress event
   },
   onDownloadProgress: function (progressEvent) {
  // `onDownloadProgress` 允许为下载处理进度事件
  // 对原生进度事件的处理
   },
  }

  (1)get 请求

    axios.get('url',{params:{
//这里是请求参数
}})
.then(res=>{
    //这里是响应后操作
})
.catch(err=>{
    //异常捕获
})

  (2)post 请求

    axios.post('url',{
name:xxx//参数
},{
headers:xxxx,//请求头信息
})
.then(function(res){
//处理成功的函数 相当于success
})
.catch(function(error){
//错误处理 相当于error
})

  (3)all、spread 并发请求

    axios.all([
axios.get('url'),
axios.get('url',{params:{type:'sell',page:1}})
])
.then(axios.spread((res1,res2)=>{
//返回结果为一个数组
}))

  all()方法入参为一个数组,数组元素是每一项请求,回调函数 .then() 的参数也是一个数组,里面的每一项元素表示前面请求的返回结果,使用了 axios.spread作为该回调函数的参数时,其res1,res2分别代表前面每一项请求的返回结果。

  综上这些方法都只使用于小型项目中,或者学习小 demo 中,在工作开发中遇到处理的请求接口较多,

  3.axios 在项目中的常见用法?

  (1)小型项目中常见封装方法,灵活性较高。

  首先创建 axios.js 文件

     import originAxios from 'axios'
export default function axios(option){
return new Promise((resolve,reject)=>{
//创建axios实例
const instance=originAxios.create({
baseURL:'/api',
timeout:5000,
headers:''
});
//传入对象进行网络请求
instance(option)
.then(res=>{
resolve(res)
})
.catch(err=>{
reject(err)
})
})
}

  然后在需要发送请求接口的地方引入

    import {axios} from './axios.js'

    axios({method:"get",url:"url",params:{...}})
.then(res=>{
//请求数据后操作
})
.catch(err=.{
//错误处理
})

  (2)针对不同请求类型进行二次封装。

    /* *url:请求的url
*params:请求的参数
*config:请求时的header信息
*method:请求方法 */
const request = function ({ url, params, config, method }) {
// 如果是get请求 需要拼接参数
let str = "";
if (method === "get" && params) {
Object.keys(params).forEach((item) => {
str += `${item}=${params[item]}&`;
});
}
return new Promise((resolve, reject) => {
axios[method](
str ? url + "?" + str.substring(0, str.length - 1) : url,
params,
Object.assign({}, config)
)
.then(
(response) => {
resolve(response.data);
},
(err) => {
if (err.Cancel) {
} else {
reject(err);
}
}
)
.catch((err) => {
reject(err);
});
});
};

  具体使用同上。

  (3)基于请求响应拦截进行封装,实际项目开发中常用。

  axios 提供的拦截器,用于每次发送请求和得到响应后进行响应的处理。比如在请求拦截中可以在页面中添加 loading 动画,某些请求要求用户必须登录,判断用户是否有token,如果没有就跳转到登录页面等,也可以对请求参数进行序列化操作等 config.data = qs.stringfy(config.params) 等。同样,响应拦截也可以对响应的数据进行过滤,包括响应失败的拦截,可以根据响应状态码进行不同的操作等。具体方法如下:

  首先在工具方法文件夹中创建 request.js 文件。这里搭配了token用于判断用户状态,element-ui 组件处理一些错误报错提示。该文件封装暴露了get、post、文件上传方法。

      import axios from "axios";
import store from "../store";
import { Message, MessageBox } from "element-ui"; let baseURL = "http://127.0.0.1:3000/";
// 创建axios实例
const service = axios.create({
baseURL: baseURL,
timeout: 5000, // 请求超时时间
headers: { "Content-Type": "application/json;charset=UTF-8" },
});
// axios.defaults.withCredentials = true; // 若跨域请求需要带 cookie 身份识别
axios.defaults.headers.post["Access-Control-Allow-Origin-Type"] = "*"; // 允许跨域
const err = (error) => {
if (error.response) {
let data = error.response.data;
const token = store.getters.token;
switch (error.response.status) {
case 403:
Message({
message: data.message,
type: "error",
duration: 5 * 1000,
});
break;
case 500:
if (token && data.message == "Token失效,请重新登录") {
MessageBox.confirm(
"很抱歉,登录已过期,请重新登录",
"确定登出",
{
confirmButtonText: "重新登录",
cancelButtonText: "取消",
type: "warning",
}
).then(() => {
store.dispatch("Logout").then(() => {
window.location.reload(); // 为了重新实例化vue-router对象 避免bug
});
});
}
break;
case 404:
Message({
message: data.message,
type: "error",
duration: 5 * 1000,
}); break;
case 504:
Message({
message: data.message,
type: "error",
duration: 5 * 1000,
});
break;
case 401:
Message({
message: data.message,
type: "error",
duration: 5 * 1000,
});
if (token) {
store.dispatch("Logout").then(() => {
setTimeout(() => {
window.location.reload();
}, 1500);
});
}
break;
default:
Message({
message: data.message,
type: "error",
duration: 5 * 1000,
});
break;
}
}
return Promise.reject(error);
};
// request拦截器
service.interceptors.request.use(
(config) => {
const token = store.getters.token;
if (store.getters.token) {
config.headers["X-Token"] = token;
}
return config;
},
(error) => {
// Do something with request error
console.log(error); // for debug
Promise.reject(error);
}
);
// respone拦截器
service.interceptors.response.use((response) => {
console.log("response.data", response.data);
return response.data;
}, err); /*
* get请求
* url:请求地址
* params:参数
* */
export function get(url, params = {}) {
return new Promise((resolve, reject) => {
console.log("process.env.BASE_API", process.env.BASE_API);
service({
url: url,
method: "get",
params: params,
})
.then((response) => {
resolve(response);
})
.catch((error) => {
reject(error);
});
});
} /*
* post请求
* url:请求地址
* params:参数
* */
export function post(url, params = {}) {
return new Promise((resolve, reject) => {
service({
url: url,
method: "post",
data: params,
})
.then((response) => {
resolve(response);
})
.catch((error) => {
reject(error);
});
});
} /*
* 文件上传
* url:请求地址
* params:参数
* */
export function fileUpload(url, params = {}) {
return new Promise((resolve, reject) => {
console.log("@@@@@@@@@@@params", params);
service({
url: url,
method: "post",
data: params,
headers: { "Content-Type": "multipart/form-data" },
})
.then((response) => {
resolve(response);
})
.catch((error) => {
reject(error);
});
});
} export default {
get,
post,
fileUpload,
};

  然后创建api文件夹,如果接口过多可以对接口进行模块化管理,比如我这 api 下面创建 login.js 文件。

import { get, post,fileUpload } from "../utils/request";

// 登录
export const login = (params) => {
return get("/user/login", { ...params });
};
// 查询用户信息
export const getUserInfo = (params) => {
return get("/user/userInfo", { ...params });
};
// 上传音频文件
export const addRadioApi = (params, file) => {
return fileUpload("/radio/addRadio", { params, file });
};

  最后在你的vue文件中就可以使用了,login.vue中使用如下:

      import { login } from "../../api/login";
login({ name: "123", password: "123456" })
.then((res) => {
//登录请求后操作
})
.catch((error) => {
//异常处理
});

总结

  以上就是本文的全部内容,希望给读者带来些许的帮助和进步,方便的话点个关注,小白的成长踩坑之路会持续更新一些工作中常见的问题和技术点。

vue-axios的总结及项目中的常见封装方法。的更多相关文章

  1. 在使用vue+webpack模版创建的项目中使用font-awesome

    前言:最近使用vue+webpack进行一个小项目的开发,按照官方模版文档完成项目初始化后打算引入ont-awesome字体图标库进行使用,引入过程中遇到一些问题并解决,现记录如下. 一开始进展很顺利 ...

  2. iOS之多控制器管理--项目中的常见文件

    项目中的常见文件 内容大纲: 1.LaunchScreen 2.info.plist文件 3.pch文件 1.LaunchScreen xcode5和xcode6区别 1.xcode6没有Framew ...

  3. ThinkPHP公共配置文件与各自项目中配置文件组合的方法

    ThinkPHP公共配置文件与各自项目中配置文件组合的方法 文章TAG:thinkphp 公共配置文件 时间:2014-11-25来源:www.aspku.com 作者:源码库 文章热度: 146 ℃ ...

  4. JAVA项目中引用Logback的方法

    一.简介 本文主要讲JAVA项目中引入Logback的方法. 二.解决 1.引入依赖. <!--Begin LogBack Log--> <!-- https://mvnreposi ...

  5. VB的一些项目中常用的通用方法-一般用于验证类

    1.VB的一些项目中常用的通用方法: ' 设置校验键盘输入值,数字 Public Function kyd(key As Integer) As Integer Dim mychar mychar = ...

  6. Xcode 6.4项目中的常见文件(info.plist)

    Xcode 6.4项目中的常见文件(info.plist) 代码中获取 info.plist[NSBundle mainBundle] infoDictionary]; Bundle display ...

  7. iOS 项目中的常见文件

    iOS的笔记-项目中的常见文件   新建一个项目之后,有那么多的文件,下面介绍一下主要的几个. 1.文件名 (1)AppDelegate UIApplication的代理,app收到干扰的时候,进行处 ...

  8. rxjs入门3之项目中ajax函数封装

    项目中ajax函数封装 ⽹页应⽤主要数据源有两个:⼀个是⽹页中的DOM事件,另⼀个就是通过AJAX获得的服务器资源.我们已经知道fromEvent这个操作符可以根据DOM事件产⽣Observable对 ...

  9. vue打包发布在spingboot项目中 vue-router路由的处理

    (原) 以下例子springboot后端地址为:localhost:7080/pingandai vue前端地址为:locahost:8080/pingandai/ 1.如果路由模式设置的是histo ...

随机推荐

  1. Apache配置 8.配置防盗链

    (1)介绍 防盗链,通俗讲,就是不让别人盗用你网站上的资源.这个资源,通常指的是图片.视频.歌曲.文档等. (2)配置 配置防盗链先编辑主机配置文件: #vim /usr/local/apache2. ...

  2. vue 实现页面嵌套pdf之vue-pdf插件

    近期vue移动端项目中遇到了页面内,嵌套展示pdf内容.实现方法很多种,可以用iframe嵌套,但不利于引擎优化seo.所以在网上找到了vue-pdf这个插件,这个插件非常好用,其中封装的方法也很多, ...

  3. 「CTSC 2013」组合子逻辑

    Tag 堆,贪心 Description 给出一个数列 \(n\) 个数,一开始有一个括号包含 \([1,n]\),你需要加一些括号,使得每个括号(包括一开始的)所包含的元素个数 \(\leq\) 这 ...

  4. LeetCode 175. Combine Two Tables 【MySQL中连接查询on和where的区别】

    一.题目 175. Combine Two Tables 二.分析 连接查询的时候要考虑where和on的区别 where : 查询时,连接的时候是必须严格满足条件的,满足了才会加入到临时表中. on ...

  5. Net Core 重要的技术点

    Net Core 重要的技术点 1.中间件概念 Asp.Net Core作为控制台应用程序启动,在Program的Main方法是入口,通过调用CreateWebHostBuilder创建WebHost ...

  6. 以Aliyun体验机为例,从零搭建LNMPR环境(上)

    使用云服务器搭建 Web 运行环境,尤其是搭建常见的 LNMPR(Linux+Nginx+MySQL+PHP+Redis) 环境,对于开发人员是必备的职场基本技能之一.在这里,借着搭建我的" ...

  7. 「HTML+CSS」--自定义按钮样式【004】

    前言 Hello!小伙伴! 首先非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出- 哈哈 自我介绍一下 昵称:海轰 标签:程序猿一只|C++选手|学生 简介:因C语言结识编程,随后转入计算机 ...

  8. 17. vue-route详细介绍

    前后端路由的来历 前端如何实现页面跳转但是不刷新? 了解hash和history两种方法 vue-router基本使用 安装vue-router 搭建vue-router框架的步骤 vue-route ...

  9. java面试-公平锁/非公平锁/可重入锁/递归锁/自旋锁谈谈你的理解

    一.公平锁/非公平锁/可重入锁/递归锁/自旋锁谈谈你的理解 公平锁:多个线程按照申请的顺序来获取锁. 非公平锁:多个线程获取锁的先后顺序与申请锁的顺序无关.[ReentrantLock 默认非公平.s ...

  10. 考前自救题库NABCD分析

    考前自救题库NABCD分析 项目 内容 这个作业属于哪个课程 2021春季软件工程(罗杰 任健) 这个作业的要求在哪里 团队项目-初次邂逅,需求分析 项目名称:考前自救题库(暂定) 项目简介:本产品计 ...