在做项目的时候,我们平常会对接口api进行一些封装。今天来教给大家一些简单的封装接口的方法。

一.request.js文件夹

通常情况下我们会在utils/request.js封装自己的api。

// 1.导入axios
import axios from "axios";
// 2.创建axios副本
const _axios = axios.create({
  baseURL: process.env.VUE_APP_BASE_API,
});
// 3.请求拦截器
_axios.interceptors.request.use(
  (config) => {
    return config;
  },
  (error) => {
    console.log(error, "请求失败之后的结果");
    return Promise.reject(error);
  }
);
// 4.响应拦截器
_axios.interceptors.response.use(
  (res) => {
    if (res.data.success) {
      return res.data;
    } else {
      // 错误的提示信息
      return Promise.reject(res.data.message);
    }
  },
  (error) => {
    // return Promise.reject(error);
    return error, "响应失败的结果";
  }
);
// 5.暴露出去
export default _axios;

分析步骤:

1.导入了axios

2.深拷贝了一份,并且能够配置基地址

后面了两个拦截器我要重点进行剖析了。

拦截器是固定的写法。

3.然后暴露出去。

二.测试接口,如果要调用一个登录的接口

import request from "./request";
// 登录
export function sysLogin(data) {
  return request({
    url: "/sys/login",
    method: "POST",
    data,
  });
}

分析步骤:

导入配置好的api文件

然后配置好信息

如请求的地址:

请求的方法:

请求的参数:

三.遇到跨域的问题

这是一个老生常谈的问题,在以前的文章也有讲过,跨域的问题是如何解决的。

 

四.开始调用接口

代码:

<template>
  <div class="">
    <form>
      账号: <input type="text" v-model="from.mobile" /> 密码:<input
        type="password"
        v-model="from.password"
      />
    </form>
    <button @click="fn">点击登录</button>
  </div>
</template>

<script>
import { sysLogin } from "./api/login";
export default {
  data() {
    return {
      from: {
        mobile: "13800000002",
        password: "123456",
      },
    };
  },
  created() {
    alert(process.env.VUE_APP_BASE_API, "我是基地址");
  },
  name: "",
  methods: {
    async fn() {
      const res = await sysLogin(this.from);
      console.log(res);
    },
  },
};
</script>

<style scoped>
button {
  width: 200px;
  height: 30px;
  background-color: pink;
  margin: 300px auto;
}
</style>

解析:既然是默认导出的,那么肯定是要默认导入,千万要加上{},名字也不要随便更改,如果要更改需要加上as关键字后面接上自己要更改的名字。

好了,那么我们愉快地来调用接口吧

这样我们就成功地调用了一个接口了。

在阐述拦截器之间,分析一下一个请求的过程。

也就是请求还没到服务器的时候会进行一次拦截。

数据还没到客户端的时候又会进行一次拦截。

那么我们可以做一些响应的操作。

五.可以在拦截器里面进行的操作

还是上面封装的api不做任何改变。

请求拦截:

_axios.interceptors.request.use(
  (config) => {
    console.log(config, "请求之前的一些东西");
    return config;
  },
  (error) => {
  // 对请求错误做些什么
    return Promise.reject(error);
  }
);

点击按钮打印config这个参数的结果是:

可以看出这里里面包含了请求的信息。我们可以做一些操作。

在发送请求之前携带token。判断toekn是否过期。

响应拦截:

_axios.interceptors.response.use(
  (res) => {
    console.log(res, "响应之前的一些东西");
    if (res.data.success) {
      return res.data;
    } else {
      return Promise.reject(res.data.message);
    }
  },
  (error) => {
    //对响应错误做什么
    return Promise.reject(error);
  }
);

res,就是响应回来的一些数据,我们可以做一些判断,如果成功就进行一层解析以res.data的形式传递过去,如果失败就错一个失败的统一错误处理。

然后分析一下两个错误

在请求之前会携带东西,如果出现错误也要给用户一些相应的提示信息。

例如

代码:

_axios.interceptors.response.use(
  (res) => {
    alert("响应成功");
    if (res.data.success) {
      return res.data;
    } else {
      return Promise.reject(res.data.message);
    }
  },
  (error) => {
    // 响应失败的提示语
    return alert(error);
  }
);

 

这是响应错误给出的提示。

请求错误也应该给出一定的提示。

总结:

在发送一个请求的时候,具体的流程

Logo

前往低代码交流专区

更多推荐