热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Vue项目使用axios相关解说

介绍Axios是一个基于promise的HTTP库,可以用在浏览器和node.js中。点击看这个吧从浏览器中创建XMLHttpRequests从node.js创建

介绍

Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。
点击看这个吧

  • 从浏览器中创建 XMLHttpRequests
  • node.js 创建 http 请求
  • 支持 Promise API
  • 拦截请求和响应
  • 转换请求数据和响应数据
  • 取消请求
  • 自动转换 JSON 数据
  • 客户端支持防御 XSRF

get请求

axios.get('/user', {params: {ID: 1111}})
.then(function (response) {console.log(response);
})
.catch(function (error) {console.log(error);
});// 还可以这么写,es7新特性async/await
async function getUser() {try {const response = await axios.get('/user?ID=1111');console.log(response);} catch (error) {console.error(error);}
}*async用于声明一个函数是异步的,而await是“等待”的意思,就是用于等待异步完成。
await只能在async函数中使用。
await可以让js进行等待,直到一个promise执行并返回它的结果,js才会继续往下执行。
async/await 面试经常问到哦,百度查一下,划重点

post请求

axios.post('/user', {firstName: 'xiliDong',lastName: 'dongxili'})
.then(function (response) {console.log(response);
})
.catch(function (error) {console.log(error);
});
//或者这样写
axios({method: 'post',url: '/user',data: {firstName: 'xiliDong',lastName: 'dongxili'}
});

执行多个并发请求

function getUserAccount() {return axios.get('/user/12345');
}
function getUserPermissions() {return axios.get('/user/12345/permissions');
}
axios.all([getUserAccount(), getUserPermissions()])
.then(axios.spread(function (acct, perms) {// 两个请求现在都执行完成
}));

创建实例(重点)

可以使用自定义配置新建一个 axios 实例

axios.create([config])

var instance = axios.create({baseURL: '请求地址前缀',timeout: 1000,headers: {'X-Custom-Header': 'foobar'}
});

响应结构:

{data: {}, // data由服务器提供的响应status: 200, // 服务器响应的 HTTP 状态码statusText: 'OK', // 服务器响应的 HTTP 状态信息headers: {}, // 服务器响应的头config: {} // 为请求提供的配置信息
}使用 then 时,你将接收下面这样的响应:
axios.get('/user/1111').then(function(response) {console.log(response.data);console.log(response.status);console.log(response.statusText);console.log(response.headers);console.log(response.config);});

指定配置的默认值:

axios.defaults.baseURL = 'https://api.example.com';
axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';

自定义实例默认值:

// 创建实例时设置配置的默认值
var instance = axios.create({baseURL: 'https://api.example.com'
});
// 在实例已创建后修改默认值
instance.defaults.headers.common['Authorization'] = AUTH_TOKEN;

拦截器:

// request拦截器
import axios from 'axios'
import router from '../router'
// 创建axios实例
const service = axios.create({timeout: null // 请求超时时间
})
let serviceTips = '服务器超时'// request拦截器
service.interceptors.request.use(config => {// console.log(service.interceptors)// 获取本地tokenlet token = localStorage.getItem('tokendata')// 设置请求头let headers = 'application/json'// 是否携带tokenlet tokenFlag = true// 是否修改请求信息if (config.opts) {// 获取携带token状态tokenFlag = config.opts ? config.opts.token : true// 获取请求头headers = config.opts.Header ? config.opts.Header : 'application/json'// 拓展头部参数let Head = config.opts.Headif (Head) {for (let key in Head) {config.headers[key] = Head[key]}}}// 暂时不加入token验证// if (token && tokenFlag) {// // 条件允许,携带token请求// config.headers['JSESSIONID'] = token// // config.headers['X-Auth0-Token'] = token// } else {// headers = 'application/x-www-form-urlencoded'// }// 设置请求格式config.headers['Content-Type'] = headersreturn config},err => {return Promise.reject(err)}
)// http response 服务器响应拦截器
service.interceptors.response.use(response => {return response},error => {if (error.response) {switch (error.response.status) {case 401:error.response.data = '登陆超时,重新登陆'router.replace({path: '/login',query: {redirect: router.currentRoute.fullPath} // 登录成功后跳入浏览的当前页面})breakcase 404:error.response.data = '资源不存在'breakcase 406:error.response.data = '头部无携带token'breakcase 412:// 拦截错误 并重新跳入登页重新获取tokenrouter.replace({path: '/login',query: {redirect: router.currentRoute.fullPath} // 登录成功后跳入浏览的当前页面})error.response.data = '秘钥失效'localStorage.removeItem('tokendata') // 清除tokenbreakcase 415:error.response.data = '请求type有误'breakcase 500:error.response.data = '服务器异常'break}serviceTips = error.response.data}Message.error(serviceTips)return Promise.reject(serviceTips)}
)
export default service

配置好后使用:

在api.js中引入拦截器:
import fetch from '@/utils/fetch' // 拦截器
export function getList(obj) {const data = objreturn fetch({url: '',method: 'POST',data})
}--------------------------------
可以使用 validateStatus 配置选项定义一个自定义 HTTP 状态码的错误范围。
export function getList(obj) {const data &#61; objreturn fetch({url: &#39;&#39;,method: &#39;POST&#39;,validateStatus: function(status) {// return status >&#61; 200 && status <300; // 默认的return status < 500; // 状态码在大于或等于500时才会 reject},data})
}

重点

axios的请求头默认为&#39;application/json&#39;&#xff0c;
即axios会默认序列化 Javascript 对象为 JSON.
如果想使用 application/x-www-form-urlencoded 格式&#xff0c;你可以使用下面的配置:
import Qs from &#39;qs&#39;export function getList(obj) {const data &#61; Qs.stringify(obj)return fetch({url: &#39;&#39;,method: &#39;POST&#39;,headers: {&#39;content-type&#39;: &#39;application/x-www-form-urlencoded&#39;,// 如果需要XMLHttpRequest&#xff0c;加入这个&#39;X-Requested-With&#39;: &#39;XMLHttpRequest&#39;},data})
}

单页面使用

import {getList} from &#39;&#64;/api/base.js&#39;
// param为前端传入的参数
getList(param).then(res &#61;> {if (res.data.code &#61;&#61;&#61; 0) {//获取成功业务代码} else {this.$message({message: &#96;[${res.data.msg}]:查询失败&#96;,type: "error"});}
})
.catch(() &#61;> {})

移除拦截器

var 拦截器 &#61; axios.interceptors.request.use(function () {/*...*/});
axios.interceptors.request.eject(拦截器);

取消请求

可以使用 CancelToken.source 工厂方法创建 cancel token

var CancelToken &#61; axios.CancelToken;
var source &#61; CancelToken.source();axios.get(&#39;/user/1111&#39;, {cancelToken: source.token
}).catch(function(thrown) {if (axios.isCancel(thrown)) {console.log(&#39;Request canceled&#39;, thrown.message);} else {// 处理错误}
});// 取消请求&#xff08;message 参数是可选的&#xff09;
source.cancel(&#39;Operation canceled by the user.&#39;);

还可以通过传递一个 executor 函数到 CancelToken
的构造函数来创建 cancel token&#xff1a;

var CancelToken &#61; axios.CancelToken;
var cancel;axios.get(&#39;/user/12345&#39;, {cancelToken: new CancelToken(function executor(c) {// executor 函数接收一个 cancel 函数作为参数cancel &#61; c;})
});// 取消请求
cancel();注意&#xff0c;还可以使用同一个 cancel token 取消多个请求

点击前往参考地址


推荐阅读
  • 本打算教一步步实现koa-router,因为要解释的太多了,所以先简化成mini版本,从实现部分功能到阅读源码,希望能让你好理解一些。希望你之前有读过koa源码,没有的话,给你链接 ... [详细]
  • Maven + Spring + MyBatis + MySQL 环境搭建与实例解析
    本文详细介绍如何使用MySQL数据库进行环境搭建,包括创建数据库表并插入示例数据。随后,逐步指导如何配置Maven项目,整合Spring框架与MyBatis,实现高效的数据访问。 ... [详细]
  • 本文探讨了如何通过优化 DOM 操作来提升 JavaScript 的性能,包括使用 `createElement` 函数、动画元素、理解重绘事件及处理鼠标滚动事件等关键主题。 ... [详细]
  • 一、Advice执行顺序二、Advice在同一个Aspect中三、Advice在不同的Aspect中一、Advice执行顺序如果多个Advice和同一个JointPoint连接& ... [详细]
  • 本文档详细介绍了软通动力Java开发工程师职位的笔试题目,涵盖了Java基础、集合框架、JDBC、JSP等内容,并提供了详细的答案解析。 ... [详细]
  • flea,frame,db,使用,之 ... [详细]
  • 本文详细探讨了在Web开发中常见的UTF-8编码问题及其解决方案,包括HTML页面、PHP脚本、MySQL数据库以及JavaScript和Flash应用中的乱码问题。 ... [详细]
  • 本文介绍了如何通过 XMLHttpRequest 对象在不同浏览器中实现 AJAX 的 POST 和 GET 请求,并详细说明了 XMLHttpRequest 的五个状态及其含义。 ... [详细]
  • 微信小程序开发指南:创建动态电影选座界面
    本文详细介绍如何在微信小程序中实现一个动态且可视化的电影选座组件,提高用户体验。通过合理的布局和交互设计,使用户能够轻松选择心仪的座位。 ... [详细]
  • JavaScript 实现图片文件转Base64编码的方法
    本文详细介绍了如何使用JavaScript将用户通过文件输入控件选择的图片文件转换为Base64编码字符串,适用于Web前端开发中图片上传前的预处理。 ... [详细]
  • 在尝试启动Java应用服务器Tomcat时,遇到了org.apache.catalina.LifecycleException异常。本文详细记录了异常的具体表现形式,并提供了有效的解决方案。 ... [详细]
  • 如何处理PHP缺少扩展的问题
    本文将详细介绍如何解决PHP环境中缺少扩展的问题,包括检查当前环境、修改配置文件以及验证修改是否生效的具体步骤,帮助开发者更好地管理和使用PHP扩展。 ... [详细]
  • 作为一名新手开发者,我正在尝试使用 ASP.NET 和 Vue.js 构建一个单页面应用,涉及多个复杂组件(如按钮、图表等)。希望有经验的开发者能够提供指导。 ... [详细]
  • 在移动端开发中,多点触控手势是提升用户体验的重要手段。然而,目前只有iOS浏览器原生支持手势事件,其他设备需要通过touchstart、touchmove和touchend等基础事件进行自定义实现。本文将详细介绍如何在Vue项目中实现多点触控手势。 ... [详细]
  • vue引入echarts地图的四种方式
    一、vue中引入echart1、安装echarts:npminstallecharts--save2、在main.js文件中引入echarts实例:  Vue.prototype.$echartsecharts3、在需要用到echart图形的vue文件中引入:   importechartsfrom&amp;quot;echarts&amp;quot;;4、如果用到map(地图),还 ... [详细]
author-avatar
瓜子HR刘冲
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有