以登录流程为例说明接口的封装。

1.登录调用后台的登录api

登录界面的代码

<template>
<div class="login-page">
<div class="login-container">
<div class="login-title">后台管理系统</div>
<el-form
ref="loginForm"
:model="loginForm"
:rules="rules"
auto-complete="on"
label-position="left"
class="login-form"
>
<el-form-item prop="username">
<el-input
prefix-icon="el-icon-s-custom"
v-model="loginForm.username"
placeholder="用户名"
name="username"
type="text"
tabindex="1"
auto-complete="off"
/>
</el-form-item> <el-form-item prop="password">
<el-input
prefix-icon="el-icon-lock"
type="password"
v-model="loginForm.password"
placeholder="密码"
name="password"
tabindex="2"
auto-complete="off"
@keyup.enter.native="submitForm()"
/>
</el-form-item>
<div class="login-btn">
<el-button :loading="loading" type="primary" @click="submitForm()">登录</el-button>
</div>
<p class="login-tips">Tips : 一条小尾巴。。。</p>
</el-form>
</div>
</div>
</template> <script>
import { vuetest } from '@/api/index' var validateUsername = (rule, value, callback) => {
console.log(value);
if (value == undefined || value === "") {
callback(new Error("请输入用户名"));
} else {
callback();
}
};
var validatePassword = (rule, value, callback) => {
if (value == undefined || value === "") {
callback(new Error("请输入密码"));
} else {
callback();
}
}; export default {
name: "Login",
data() {
return {
loginForm: {
username: "admin",
password: "111111"
},
rules: {
username: [
{ required: true, trigger: "blur", validator: validateUsername }
],
password: [
{ required: true, trigger: "blur", validator: validatePassword }
]
},
loading: false
};
},
methods: {
submitForm() {
this.$refs.loginForm.validate(valid => {
if (valid) {
this.loading = true;
// 方法后台验证登录信息,验证成功后
vuetest().then(res => {
console.log("===============vue test===========");
console.log(res);
console.log(res.data.status);
console.log(res.data.token); var tk = res.data.token;
this.$store.dispatch("user/login", this.loginForm).then(() => {
this.$store.dispatch("user/setTokenStore", tk);
// 信息成功存储在vuex后跳转页面
this.$router.push("/home");
this.loading = false;
});
// this.$router.push("/home");
// this.loading = false;
}).catch(error => {
console.log("===============vue test error===========");
console.log(error);
})
// 将用户信息报存在vuex中
// this.$store.dispatch("user/login", this.loginForm).then(() => {
// // 信息成功存储在vuex后跳转页面
// this.$router.push("/home");
// this.loading = false;
// });
//this.$router.push("/home");
//localStorage.setItem('ms_username', this.loginForm.username);
} else {
this.$message.error("登录异常");
return false;
}
});
}
}
};
</script>

2.请求api的封装

import { vuetest } from '@/api/index'  --- 引用src/api/idex.js文件中的export的vuetest 请求。src/api/idex.js中有请求方式、请求参数等设置

vuetest().then(res => {  ----- res请求服务端接口返回的数据

src/api/idex.js文件代码

// api封装示例

// 导入配置好的axios文件
import Axios from "@/axios" // 封装axios请求函数,并用export导出
export function getItemList(datas) {
return Axios({
url: "/api/getItemList",
method: "post",
headers: {
'Content-Type': 'application/x-www-form-urlencoded' //设置请求头请求格式form
},
data: datas
})
}
export function getItem(datas) {
return Axios({
url: "/api/getItem",
method: "post",
headers: {
'Content-Type': 'application/json' //设置请求头请求格式为json
},
data: datas
})
} export function getItemInfo(datas) {
return Axios({
url: "/api/getItemInfo"+datas,
method: "get",
})
} export function vuetest(datas) {
return Axios({
url: "/vue/test",
method: "post",
headers: {
'Content-Type': 'application/json' //设置请求头请求格式为json
},
data: datas
})
}

说明:

调用最后一个函数,专注于请求参数的处理。

return Axios({ ----- 是ajax请求的处理,Axios是import Axios from "@/axios"中导出的对象

3.ajax请求的进一步封装,主要是对所有ajax请求的一些共同的参数的设定,如超时时间、根路径

src/axios中的index文件(这个index.js文件的名字应该是不能改变的,所有导入的路径没有确定到文件而是目录)

//引入 axios库
import axios from 'axios'
//引入 node中自带的qs模块(数据格式转换)
import qs from 'qs' /* 2.全局默认配置 */
let baseURL
// 判断开发环境(一般用于本地代理)
// if (process.env.NODE_ENV === 'development') { // 开发环境
// baseURL = 'http://localhost:8082/VoucherWebService' // 你设置的本地代理请求(跨域代理),下文会详细介绍怎么进行跨域代理
// } else { // 编译环境
// if (process.env.type === 'test') { // 测试环境
// baseURL = 'http://sw.apitest.com'
// } else { // 正式环境
// baseURL = 'http://sw.api.com'
// }
// } // 配置axios的属性
axios.defaults.timeout = 6000; // 请求超时时间1分钟
//axios.defaults.baseURL = baseURL; // 你的接口地址
axios.defaults.responseType = "json";
axios.defaults.withCredentials = false; //是否允许带cookie这些 /*你也可以创建一个实例,然后在实例中配置相关属性,此方法和上面的方法一样,写法不同,怎么用随个人
*喜好,我比较喜欢用这种方法,如下:
*/
const Axios = axios.create({
baseURL:baseURL , // 后台服务地址
timeout: 60000, // 请求超时时间1分钟
responseType: "json",
withCredentials: false // 是否允许带cookie这些
}); /* 3.设置拦截器 */
/*如果不是用创建实例的方式配置,那么下面的Axios都要换成axios,也就是文件开头你用import引入axios
时定义的变量*/
Axios.interceptors.request.use((config) => {
// 发送请求前进行拦截
// 可在此处配置请求头信息
// config.headers["appkey"] ="...";
// config.headers["token"] ="...";
console.log("======interceptors=====");
console.log(config);
if (config.method == "post") {
/*数据转换: axios post方式默认是json格式提交数据,如果使用application/x-www-form-urlencoded数据格式提交,要用qs.stringify()进行转换,个人建议不在拦截器中全局配置,因为不够灵活,还有一点是,如果
设置了重新请求的配置,那么重新请求时,请求体中的config里面的传参就会被再次进行qs.stringify()转
换,会使得参数丢失,造成请求失败。*/
config.data = qs.stringify(config.data)
}
return config;
},(error) =>{
//console.log("错误的传参", 'fail');
return Promise.reject(error)
}) // Axios.interceptors.response.use((res) =>{
// // 请求响应后拦截
// if(res.status == 200){ // 对响应数据做些事
// //alert("提交成功")
// return Promise.resolve(res)
// }
// return res;
// }, (error) => {
// //alert("网络异常!") 404等问题可以在这里处理
// return Promise.reject(error)
// })
export default Axios

如果浏览器报这个错:: No 'Access-Control-Allow-Origin' header

这是个跨域问题:client/server同一个ip不同端口或者相同的端口不同的ip或者ip、端口都不同(个人理解)

vue-cli2解决方法(3.x网上也有),在

config/index.js文件中的proxyTable添加如下配置:

  proxyTable: {
'/': {
target: 'http://localhost:8082/myproject', //你要访问的服务器域名
changeOrigin: true, //允许跨域
pathRewrite: {
'^/': ''
}
} },

axios中的baseURL 不能配置否则就不用这个代理的配置了。

vue学习过程总结(07) - vue的后台服务API封装及跨域问题的解决的更多相关文章

  1. 如何实现vue前端跨域,proxyTable解决开发环境前端跨域问题

    在开发环境与后端调试的时候难免会遇到跨域问题,很多人说跨域交给后端解决就好了. 其实不然,前端也有很多方法可以解决跨域,方便也快捷. 常见的有nginx转发.node代理. 在vue项目中常用的是pr ...

  2. vue+django分离开发的思想和跨域问题的解决

    一.介绍 在前后端分离的开发过程中,会涉及到跨域的问题,比如本次个人使用的Django+vue的框架,在vue对Django进行响应,Django再将响应的数据返回给vue,vue在进行渲染,如果不设 ...

  3. springboot 服务工程,前端服务调用接口报跨域错误

    前后端分离,VUE.JS调用服务接口时,跨域错误.需要服务接口工程设置,如下: @SpringBootApplicationpublic class SpringCloudOpenapiApplica ...

  4. 03 . Gin+Vue开发一个线上外卖应用(用户数据创建,插入,跨域处理)

    功能和背景介绍 在项目的登录功能中,如果在登录时发现用户名和密码在用户表中不存在,会自动将用户名和密码保存在用户表中,创建一个新的用户. 因此,除了使用手机号和验证码登录以外,还支持使用用户名.密码进 ...

  5. nodeJS(express4.x)+vue(vue-cli)构建前后端分离详细教程(带跨域)

    好想再回到大学宿舍,当时床虽小,房随小,但是心确是满的 ----致  西安工程大学a-114舍友们 转载请注明出处:水车:http://www.cnblogs.com/xuange306/p/6185 ...

  6. Vue 项目中遇到的跨域问题及解决方法

    原文:https://www.jb51.net/article/137278.htm 问题描述 前端 vue 框架,跨域问题后台加这段代码 header("Access-Control-Al ...

  7. 搞懂:前端跨域问题JS解决跨域问题VUE代理解决跨域问题原理

    什么是跨域 跨域:一个域下的文档或脚本试图去请求另一个域下的资源 广义的跨域包含一下内容: 1.资源跳转(链接跳转,重定向跳转,表单提交) 2.资源请求(内部的引用,脚本script,图片img,fr ...

  8. vue项目打包 部署nginx服务器 访问远程接口 本地json 跨域问题

    本文建立在你已经在windows7上已经配好了nginx的前提下进行!!! 如果没有请移步至:https://www.cnblogs.com/jack1208-rose0203/p/5739765.h ...

  9. 使用Typescript写的Vue初学者Hello World实例(实现按需加载、跨域调试、await/async)

    万事开头难,一个好的Hello World程序可以节省我们好多的学习时间,帮助我们快速入门.Hello World程序之所以是入门必读必会,就是因为其代码量少,简单易懂.但我觉得,还应该做到功能丰富, ...

随机推荐

  1. Mybatis第三方PageHelper分页插件原理

    ​ 欢迎关注公号:BiggerBoy,看更多文章 原文链接:https://mp.weixin.qq.com/s?__biz=MzUxNTQyOTIxNA==&mid=2247485158&a ...

  2. php发送邮件 (phpmailer)

    1.首先下载phpMailer文件官方文件https://sourceforge.net/projects/phpmailer/: 还有class.smtp.php. 2.去配置一下发送邮件的服务器, ...

  3. .NET 云原生架构师训练营(权限系统 代码实现 WebApplication)--学习笔记

    目录 开发任务 代码实现 开发任务 DotNetNB.Security.Core:定义 core,models,Istore:实现 default memory store DotNetNB.WebA ...

  4. JNDI漏洞利用探索

    最近学习了师傅寻找的一些JNDI漏洞的利用链受益匪浅,自己也尝试关于JNDI漏洞利用做一些挖掘,目前JNDI在利用过程我想到了两个问题. 测试每一个JNDI Bypass 利用链都需要手动更改URL很 ...

  5. 故障分析:网络闪断引发的ServiceStack.Redis死锁问题

    背景说明 某天生产环境发生进程的活跃线程数过高的预警问题,且一天两个节点分别出现相同预警.此程序近一年没出现过此类预警,事出必有因,本文就记录下此次根因分析的过程. 监控看到的线程数变化情况: 初步的 ...

  6. 深入理解Java类加载机制,再也不用死记硬背了

    谈谈"会"的三个层次 在<说透分布式事务>中,我举例里说明了会与会的差别.对一门语言的学习,这里谈谈我理解的"会"的三个层次: 第一层:了解这门语言 ...

  7. operator的解释

    operator是C++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator=整体上视为一个函数名. 这是C++扩展运算符功能的方法,虽然样子古怪,但也可以理解:一方面要使运算 ...

  8. 华为模拟器 AP AC配置

    组网示意图: 前提条件:1)所有设备工作正常2)依据上述组网建立测试环境 1)正确配置AC使AP发放SSID:'SSID-Temp1'.'SSID-Temp2'和'SSID-Temp3',且对应业务v ...

  9. 决策树CART回归树——算法实现

    决策树模型 选择最好的特征和特征的值进行数据集划分 根据上面获得的结果创建决策树 根据测试数据进行剪枝(默认没有数据的树分支被剪掉) 对输入进行预测 模型树 import numpy as np de ...

  10. QT:中文字符串与“常量中有字符串”报错

    解决方法参照: (10条消息) Qt5.9 win7系统 中文字符串报错:常量中有字符串_Be busy living or busy dying-CSDN博客 主要是用QStringLiteral( ...