安装依赖

npm install --save axios
# vue-axios是对axios的简单封装
npm install --save vue-axios

用例

在main.js里面进行全局引入

import Vue from 'vue'
// 这里引入
import Axios from 'axios';
import VueAxios from 'vue-axios';
import App from './App'
import router from './router'
// 这里初始化
Vue.use(VueAxios, Axios)
Vue.config.productionTip = false /* eslint-disable no-new */
new Vue({
el: '#app',
router,
components: { App },
template: '<App/>'
})

在组件中调用方法

<template>
<section class="container">
<h1>姓名: {{ this.data.name }}</h1> // 张三
<h1>性别: {{ this.data.sex }}</h1> // 男
<h1>年龄: {{ this.data.age }}</h1> // 24
</section>
</template> <script>
export default {
data() {
return {
data: {}
};
},
mounted() {
this.$http
.post("http://rap2api.taobao.org/app/mock/14963/api/list", {name: '12312321'})
.then(result => {
this.data = result.data;
})
.catch(err => {
console.log(err);
});
}
};
</script> <style>
</style>

封装

main.js

import Vue from 'vue'
import App from './App'
import router from './router'
import { get, post, uploadFile } from './module/http' // 配置全局变量
Vue.prototype.post = post
Vue.prototype.get = get
Vue.prototype.uploadFile = uploadFile
Vue.config.productionTip = false /* eslint-disable no-new */
new Vue({
el: '#app',
router,
components: { App },
template: '<App/>'
})

组件中调用

<template>
<section class="container">
<h1>我是{{$route.query.name}},我今年{{$route.query.age}}岁了</h1>
<h1>姓名: {{ this.data.name }}</h1>
<h1>性别: {{ this.data.sex }}</h1>
<h1>年龄: {{ this.data.age }}</h1>
</section>
</template> <script>
export default {
data() {
return {
data: {}
};
},
mounted() {
this.post("http://rap2api.taobao.org/app/mock/14963/api/list").then((result) => {
this.data = result;
});
}
};
</script> <style>
</style>

http.js

/**axios封装
* 请求拦截、相应拦截、错误统一处理
*/
import axios from 'axios';
import QS from 'qs';
import { Toast } from 'vant';
// import store from '../store/index' // 环境的切换
if (process.env.NODE_ENV == 'development') {
axios.defaults.baseURL = '/api';
} else if (process.env.NODE_ENV == 'debug') {
axios.defaults.baseURL = '';
} else if (process.env.NODE_ENV == 'production') {
axios.defaults.baseURL = 'http://api.123dailu.com/';
} // 请求超时时间
axios.defaults.timeout = 10000; // post请求头
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'; // 请求拦截器
axios.interceptors.request.use(
config => {
// 每次发送请求之前判断是否存在token,如果存在,则统一在http请求的header都加上token,不用每次请求都手动添加了
// 即使本地存在token,也有可能token是过期的,所以在响应拦截器中要对返回状态进行判断
const token = // store.state.token;
token && (config.headers.Authorization = token);
return config;
}, error => {
return Promise.error(error);
}) // 响应拦截器
axios.interceptors.response.use(
response => {
if (response.status === 200) {
return Promise.resolve(response);
} else {
return Promise.reject(response);
}
},
// 服务器状态码不是200的情况
error => {
if (error.response.status) {
switch (error.response.status) {
// 400 请求错误
case 400:
break;
// 401: 未登录
// 未登录则跳转登录页面,并携带当前页面的路径
// 在登录成功后返回当前页面,这一步需要在登录页操作。
case 401:
router.replace({
path: '/login',
query: {
redirect: router.currentRoute.fullPath
}
});
break;
// 403 token过期
// 登录过期对用户进行提示
// 清除本地token和清空vuex中token对象
// 跳转登录页面
case 403:
Toast({
message: '登录过期,请重新登录',
duration: 1000,
forbidClick: true
});
// 清除token
localStorage.removeItem('token');
// store.commit('loginSuccess', null);
// 跳转登录页面,并将要浏览的页面fullPath传过去,登录成功后跳转需要访问的页面
setTimeout(() => {
router.replace({
path: '/login',
query: {
redirect: router.currentRoute.fullPath
}
});
}, 1000);
break;
// 404请求不存在
case 404:
Toast({
message: '网络请求不存在',
duration: 1500,
forbidClick: true
});
break;
// 408 请求超时
case 408:
err.message = '请求超时(408)';
break;
// 500 服务器错误
case 500:
err.message = '服务器错误(500)';
break;
case 501:
err.message = '服务未实现(501)';
break;
case 502:
err.message = '网络错误(502)';
break;
case 503:
err.message = '服务不可用(503)';
break;
case 504:
err.message = '网络超时(504)';
break;
case 505:
err.message = 'HTTP版本不受支持(505)';
break;
// 其他错误,直接抛出错误提示
default:
Toast({
message: error.response.data.message,
duration: 1500,
forbidClick: true
});
}
return Promise.reject(error.response);
}
}); /**
* get方法,对应get请求
* @param {String} url [请求的url地址]
* @param {Object} params [请求时携带的参数]
*/
export const get = (url, params) => {
return new Promise((resolve, reject) => {
axios.get(url, {
params: params
}).then(res => {
if (ds.resultCode === '1') {
resolve(ds.resultData);
} else {
resolve(ds.resultMsg);
}
}).catch(err => {
reject(err.data)
})
});
} /**
* post方法,对应post请求
* @param {String} url [请求的url地址]
* @param {Object} params [请求时携带的参数]
*/
export const post = (url, params) => {
return new Promise((resolve, reject) => {
axios.post(url, QS.stringify(params)).then(res => {
const ds = res.data;
if (ds.resultCode === '1') {
resolve(ds.resultData);
} else {
resolve(ds.resultMsg);
}
}).catch(err => {
reject(err);
})
});
} /**
* POST方法封装(文件上传)
* @param {String} url [请求的url地址]
* @param {Object} params [请求时携带的参数]
* @param {String} headers [设置请求headers]
*/
export const uploadFile = (url, params, headers) => {
return new Promise((resolve, reject) => {
axios.post(url, QS.stringify(params), headers).then(res => {
if (ds.resultCode === '1') {
resolve(ds.resultData);
} else {
resolve(ds.resultMsg);
}
}).catch(err => {
reject(err.data)
})
})
}

vue使用axios实现前后端通信的更多相关文章

  1. .Net Core+Vue.js+ElementUI 实现前后端分离

    .Net Core+Vue.js+ElementUI 实现前后端分离 Tags: Vue 架构 前端采用:Vue.js.Element-UI.axios 后端采用:.Net Core Mvc 本项目是 ...

  2. 如何利用vue和php做前后端分离开发?

    新手上路,前端工程师,刚毕业参加工作两个月,上面让我用vue搭建环境和php工程师一起开发,做前后端分离,然而我只用过简单的vue做一些小组件的经验,完全不知道怎样和php工程师配合,ps: php那 ...

  3. 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十四 ║ VUE 计划书 & 我的前后端开发简史

    ---新内容开始--- 番外 大家周一好呀,又是元气满满的一个周一呀!感谢大家在周一这个着急改Bug的黄金时期,抽出时间来看我的博文哈哈哈,时间真快,已经到第十四篇博文了,也很顺顺(跌跌)利利 (撞撞 ...

  4. vue中axios访问Java后端跨域问题解决

    问题背景: 前后端分离,前端选用Vue,后端选用Java,vue编译出的静态页面采用ngix发布,在前端访问后端时出现跨域问题. 解决方法: 跨域的问题解决方法有好多种,这里是通过服务端解决,以下是代 ...

  5. Vue-CLI项目-axios模块前后端交互(类似ajax提交)

    08.31自我总结 Vue-CLI项目-axios前后端交互 一.模块的安装 npm install axios --save #--save可以不用写 二.配置main.js import axio ...

  6. SpringBoot+Vue豆宝社区前后端分离项目手把手实战系列教程01---搭建前端工程

    豆宝社区项目实战教程简介 本项目实战教程配有免费视频教程,配套代码完全开源.手把手从零开始搭建一个目前应用最广泛的Springboot+Vue前后端分离多用户社区项目.本项目难度适中,为便于大家学习, ...

  7. vue.js+UEditor集成 [前后端分离项目]

    首先,谈下这篇文章中的前后端所涉及到的技术框架内容. 虽然是后端的管理项目,但整体项目,是采用前后端分离的方式完成,这样做的目的也是产品化的需求: 前端,vue+vuex+vue router+web ...

  8. vue+uwsgi+nginx部署前后端分离项目

    前后端分离,vue前端提供静态页面,且可以向后台发起get,post等restful请求. django后台提供数据支撑,返回json数据,返回给vue,进行数据页面渲染 后端 创建虚拟环境 解决dj ...

  9. web——前后端通信原理

    前端向后台传输数据: 传输方法:post  get 区别: (1)get:用于从服务器获取数据,将参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看 ...

随机推荐

  1. scala对象简单记录

    object Person { private val eyeNum = 2 def getEyeNum = eyeNum def main(args: Array[String]): Unit = ...

  2. R语言 运算符

    R语言运算符 运算符是一个符号,通知编译器执行特定的数学或逻辑操作. R语言具有丰富的内置运算符,并提供以下类型的运算符. 运算符的类型 R语言中拥有如下几种运算符类型: 算术运算符 关系运算符 逻辑 ...

  3. Java-Class-@I:org.springframework.beans.factory.annotation.Autowired

    ylbtech-Java-Class-@I:org.springframework.beans.factory.annotation.Autowired 1.返回顶部   2.返回顶部 1. pack ...

  4. xslt数值的函数与xslt字符串函数

    以下是xslt数值的函数与xslt字符串函数的说明与参考示例. 1.xslt数值的函数:(1)fn:number(arg) 返回参数的数值.参数可以是布尔值.字符串或节点集. 示例:<xsl:v ...

  5. 《转》python对象

    http://www.cnblogs.com/BeginMan/p/3160044.html 一.学习目录 1.pyhton对象 2.python类型 3.类型操作符与内建函数 4.类型工厂函数 5. ...

  6. 3-Ubuntu下python3安装pymysql模块(1)

    命令:sudo pip3 install pymysql

  7. haproxy Mycat集

    8-1   镜像haproxy docker run -it --privileged --name haproxy  docker.io/centos:latest 8-2wget http://w ...

  8. docker使用gitlab持续集成(1)

    修改ssh连接端口vi /etc/ssh/sshd_config 写docker-compose.yml文件配置gitlab version: '3' services: gitlab: image: ...

  9. mysql分区partition详解

    分区管理  论坛 1. RANGE和LIST分区的管理 针对非整形字段进行RANG\LIST分区建议使用COLUMNS分区.  RANGE COLUMNS是RANGE分区的一种特殊类型,它与RANGE ...

  10. 2019-7-29-C#-在基类定义好方法让子类继承接口就能实现

    title author date CreateTime categories C# 在基类定义好方法让子类继承接口就能实现 lindexi 2019-07-29 09:57:49 +0800 201 ...