一、数据请求封装
注:下载axios
npm install --save axios
1、回调函数的方法
1)在src——>api——>request.js
// 引入
import axios from 'axios';
// 对其进行暴露(让其在外面传入; success,failure他俩都是参数 success是一个函数,failure他也是一个函数 然后都可以回调出去 )
export function request(config,success, failure){
// 1、创建实例,不要创建全局的
const instance = axios.create({
baseURL:"http://123.207.32.32:8000/api/h8",
timeout:5000//这个是5秒的意思
})
// 发送网络请求( res 这个是一个参数的时候,不用加括号,是俩参数的时候,记得加一个圆括号)
instance(config)
.then(res=>{
// console.log(res);
// 在这块给它回调出去
success(res);
})
.catch(err=>{
// console.log(err)
// 回调出去
failure(err);
})
}
2)使用
<template>
<div>
</div>
</template>
<script>
import {request} from '@/api/request';
export default {
name: 'App',
components: {
},
created() {
request({
url:'/home/multidata'
},res=>{
console.log(res);
},err=>{
console.log(err);
})
},
}
</script>
<style>
</style>
2、关于promise的方法
1)不简写的写法
①在src——>api——>request.js
import axios from 'axios';
export function request(config){
return new Promise((resolve,reject)=>{
// 1、创建实例,不要创建全局的
const instance = axios.create({
baseURL:"http://123.207.32.32:8000/api/h8",
timeout:5000//这个是5秒的意思
})
// 发送网络请求( res 这个是一个参数的时候,不用加括号,是俩参数的时候,记得加一个圆括号)
instance(config)
.then(res=>{
resolve(res);
})
.catch(err=>{
reject(err);
})
})
}
②使用
<template>
<div>
</div>
</template>
<script>
import {request} from '@/api/request';
export default {
name: 'App',
// 这个是组件的调用
components: {
},
created() {
request({
url:'/home/multidata'
}).then(res=>{
console.log(res);
}).catch(err=>{
console.log(err);
})
},
}
</script>
<style>
</style>
2)简写的写法
①在src——>api——>request.js
import axios from 'axios';
// 对其进行暴露(让其在外面传入; success,failure他俩都是参数 success是一个函数,failure他也是一个函数 然后都可以回调出去 )
export function request(config){
// 1、创建实例,不要创建全局的
const instance = axios.create({
baseURL:"http://123.207.32.32:8000/api/h8",
timeout:5000//这个是5秒的意思
})
// 发送网络请求
return instance(config);//instance(config)它本身返回一个Promise
}
②使用
<template>
<div>
</div>
</template>
<script>
import {request} from '@/api/request';
export default {
name: 'App',
components: {
},
created() {
request({
url:'/home/multidata'
}).then(res=>{
console.log(res);
}).catch(err=>{
console.log(err);
})
},
}
</script>
<style>
</style>
二、拦截器
注:以后要拦截的时候,就使用对应的拦截器,就可以了
1、在src——>api——>request.js
//引入
import axios from 'axios';
/* 对其进行暴露(让其在外面传入;
success,failure他俩都是参数 success是一个函数,failure他也是一个函数 然后都可以回调出去)*/
export function request(config){
// 1、创建实例,不要创建全局的
const instance = axios.create({
baseURL:"http://123.207.32.32:8000/api/h8",
timeout:5000//这个是5秒的意思
})
// 2、axios拦截器,它分为全局拦截(axios.interceptors)和实例拦截,下面我们使用实例拦截
// 2-1、这样写代表拦截请求(里面有两个参数)
instance.interceptors.request.use(config=>{
// 这里拦截是成功的(这里至少是发送成功的),所以在拦截之后,要return出去,要不然外面收不到
// console.log(config);
/* 请求拦截做的一些事情:
1)比如它不符合服务器的要求的时候,在这里拦截掉;
2)在这里进行一些数据的过滤;
3)比如在页面发送请求的时候,在页面显示一个图标,在请求成功的时候,消失掉;
4)某些 网络的请求(比如登录的token),必须携带一些特殊的信息时,就比如在发送某些
必须登录之后,才能发送的求情时,可以在这判断,在没登录的时候,让其登录之后,才可
以发送某些请求*/
return config;
},err=>{//这块很少来到,因为是发送失败的(数据很少发送失败)
console.log(err);
});
// 2-2、拦截响应(这里也要传入两个参数),所以是结果
instance.interceptors.response.use(res=>{
// 服务器已经响应了,服务器返回的真正结果
// console.log(res);
// 在这返回结果,因为在别的地方要使用,如果这块不返回,在别的地方 就没办法使用
return res;
},err=>{
console.log(err);
});
// 3、发送网络请求
return instance(config)
}
2、使用(使用方法如请求封装)
// 在这块调用这个函数
import {request} from '@/api/request';
request({
url:'/home/multidata'
}).then(res=>{
console.log(res);
}).catch(err=>{
console.log(err);
})
三、axios登录的请求写法
1、src——>api——>request.js
//引入
import axios from 'axios';
/* 对其进行暴露(让其在外面传入;
success,failure他俩都是参数 success是一个函数,failure他也是一个函数 然后都可以回调出去)*/
export function request(config){
// 1、创建实例,不要创建全局的
const instance = axios.create({
baseURL:"url",
timeout:5000//这个是5秒的意思
})
// 2、axios拦截器,它分为全局拦截(axios.interceptors)和实例拦截,下面我们使用实例拦截
// 2-1、这样写代表拦截请求(里面有两个参数)
instance.interceptors.request.use(config=>{
/* 这里拦截是成功的(这里至少是发送成功的),所以在拦截之后,要return出去,
要不然外面收不到*/
// console.log(config);
/* 请求拦截做的一些事情:
1)比如它不符合服务器的要求的时候,在这里拦截掉;
2)在这里进行一些数据的过滤;
3)比如在页面发送请求的时候,在页面显示一个图标,在请求成功的时候,消失掉;
4)某些 网络的请求(比如登录的token),必须携带一些特殊的信息时,就比如在发送某些
必须登录之后,才能发送的求情时,可以在这判断,在没登录的时候,让其登录之后,才可
以发送某些请求*/
return config;
},err=>{//这块很少来到,因为是发送失败的(数据很少发送失败)
console.log(err);
});
// 2-2、拦截响应(这里也要传入两个参数),所以是结果
instance.interceptors.response.use(res=>{
// 服务器已经响应了,服务器返回的真正结果
// console.log(res);
// 在这返回结果,因为在别的地方要使用,如果这块不返回,在别的地方 就没办法使用
return res;
},err=>{
console.log(err);
});
// 3、发送网络请求
return instance(config)
}
2、在页面请求数据的时候,在加一层
住:src——>api——>login.js
import {request} from '@/api/request';
// 登录的数据
export function login(username,password){
return request({
url:'/url',
//在这写数据请求方式
method:"post",
params:{
//下面这俩是和后端约定好的键名
username,
password
}
})
}
3、在页面中调用上面的方法
住:下面用了elementUI
<template>
<div class="login_container">
<!-- 登录组件 -->
<div class="login_box">
<!-- 头像 -->
<div class="avatar_box">
</div>
<!-- 表单区域(拿到这个表单里面的实例对象,就是用ref) -->
<el-form ref='login_From' :model="loginFrom" :rules="loginRules" label-width="0px" class="login_from ">
<!-- 账户 -->
<el-form-item label="" prop="userName">
<el-input prefix-icon="iconfont icon-user" v-model="loginFrom.userName">
</el-input>
</el-form-item>
<!-- 密码 -->
<el-form-item label="" prop="userPassword">
<el-input prefix-icon="iconfont icon-3702mima" v-model="loginFrom.password" type="password">
</el-input>
</el-form-item>
<!-- -->
<el-form-item label="" class="login_btns">
<el-button type="primary" @click="loginBtn">登录</el-button>
<el-button type="info" @click="restBtn">重置</el-button>
</el-form-item>
</el-form>
</div>
</div>
</template>
<script>
// 引入数据的请求
/* import {request} from '@/api/request';*/
import {login} from '@/api/login.js';
export default {
data() {
return {
// 这是登陆的数据对象
loginFrom:{
userName:'admin',
password:'123456'
},
// 添加验证对象
loginRules:{
// 用户名
userName:[
{ required:true,message:'请输入登录名称', trigger:'blur'},
{ min:3, max:10, message: '长度在 3 到 10 个字符', trigger: 'blur' }
],
// 密码
userPassword:[
{ required:true,message:'请输入登录密码', trigger:'blur'},
{ min:3, max:10, message: '长度在 3 到 10 个字符', trigger: 'blur' }
]
}
}
},
methods: {
// 点击重置的
restBtn(){
// 指向当前登录的组件实例对象
// console.log(this);
this.$refs.login_From.resetFields();//他是重置表单
},
// 点击登录,对他进行一个yu验证
loginBtn(){
// 登录的数据
/*
//像下面这个写法,可以省略第二步
request({
url: '/login',
method:"post",
params: {
username:this.loginFrom.userName,
password:this.loginFrom.password
}
}).then(res =>{
console.log(res);
})
*/
//传入两个参数
login(this.loginFrom.userName,this.loginFrom.password).then(res =>{
console.log(res);
})
},
},
}
</script>
<style scoped>
</style>
四、请求报错的解决方法
住:出现以下报错的时候:
出现这个表示后端解决了跨域,但是 前台的请求,需要携带一个身份验证信息,但是在Options预请求时被拦截下来了,所以要解决这个拦截。
解决方法如下:
axios.defaults.withCredentials = true;
这样解决了,加在request.js里(即封装的数据请求里面)。
五、axios数据请求封装
1、在src——>utils——>request.js里写axios封装
/*
* @Author:李勇
* @Date:2020-07-09
* @LastEditors:李勇
* @LastEditTimes:2020-07-09 10:00
* @Description:
*/
//引入
import axios from 'axios';
//解决跨域(后台解决之后,用它,它代表每次发数据的时候,要向后台发送一个身份验证,它默认是false)
axios.defaults.withCredentials = true;
// 在这块引入elementUI进行错误的提示
export function request(config){
// 1、创建实例,不要创建全局的
const instance = axios.create({
baseURL:"URL",
timeout:5000,
headers:{
"content-type": "application/json;charset=UTF-8",
}
})
// 2、axios拦截器
instance.interceptors.request.use(config=>{
//在这块给每个请求添加token,根据情况自己修改
return config;
},
err=>{//这块很少来到,因为是发送失败的(数据很少发送失败)
console.log(err);
});
// 2-2、拦截响应
instance.interceptors.response.use(res=>{
//响应拦截器,所以在这处理结果
return res;
},err=>{
console.log(err);
});
// 3、发送网络请求
return instance(config)
}