安装依赖

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. twentytwenty插件,图片对比轮播

    https://zurb.com/playground/twentytwenty 项目应用 http://decortrim.mml.digital/

  2. 线段树区间离散化——牛客多校E

    这个区间离散化把我调死了.. 总之用vector来离散化,然后叶子节点维护的是一段区间,记录下每个叶子结点的起点+长度 千万要注意下标不能弄错! #include<bits/stdc++.h&g ...

  3. Python 爬取12306火车票

    获取火车站 stations.py #import certifi #import urllib3 import re import requests from pprint import pprin ...

  4. CentOS下安装Lua

    Lua是一种轻量小巧的脚本语言,用标准  C语言编写并以源代码形式开放,其设计目的是 为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能.官网: http://www.lua.org/ 安装过 ...

  5. hive常见的存储格式

    Hive常见文件存储格式 背景:列式存储和行式存储 首先来看一下一张表的存储格式: 字段A 字段B 字段C A1 B1 C1 A2 B2 C2 A3 B3 C3 A4 B4 C4 A5 B5 C5 行 ...

  6. NX二次开发-UFUN获取边的端点UF_MODL_ask_edge_verts

    NX9+VS2012 #include <uf.h> #include <uf_modl.h> #include <uf_ui.h> #include <uf ...

  7. P1910 L国的战斗之间谍

    P1910 L国的战斗之间谍 题目背景 L国即将与I国发动战争!! 题目描述 俗话说的好:“知己知彼,百战不殆”.L国的指挥官想派出间谍前往I国,于是,选人工作就落到了你身上. 你现在有N个人选,每个 ...

  8. Windows内核驱动开发入门学习资料

    声明:本文所描述的所有资料和源码均搜集自互联网,版权归原始作者所有,所以在引用资料时我尽量注明原始作者和出处:本文所搜集资料也仅供同学们学习之用,由于用作其他用途引起的责任纠纷,本人不负任何责任.(本 ...

  9. 基于Netty的RPC架构学习笔记(十一):粘包、分包分析,如何避免socket攻击

    文章目录 问题 消息如何在管道中流转 源码解析 AbstractNioSelector.java AbstractNioWorker.java NioWorker.java DefaultChanne ...

  10. Unity NGUI 多个UIPanel对粒子的剪裁

    之前写过一篇单个 UIPanel 对粒子的裁剪,地址是:https://www.cnblogs.com/jietian331/p/5075487.html 但项目中有时会遇到多个UIPanel,如下面 ...