关于请求后端接口的封装历程(ajax -> axios -> axios封装 -> api封装)

一、总述:

原生ajax请求 ==> 原始axios请求 ==> axiose二次封装请求 ==> api解耦封装请求

二、基础代码

需求:点击小狗按钮,掉接口获取小狗图片链接,展示小狗图片;

请求接口:'dog.ceo/api/breeds/... 请求方法:get请求

三、原生ajax请求

注:当请求状态为4(完成)且状态码为200(成功)时,解析服务器返回的响应,并将狗狗图片的URL赋值给imageUrl

js 复制代码
<template>
  <div>
    <el-button @click="handleClick">小狗按钮</el-button>
    <img v-if="imageUrl" :src="imageUrl" alt="狗狗图片">
  </div>
</template>

<script>
export default {
  data() {
    return {
      imageUrl: ''
    };
  },
  methods: {
    handleClick() {
      const xhr = new XMLHttpRequest();
      xhr.open('GET', 'https://dog.ceo/api/breeds/image/random', true);
      xhr.onreadystatechange = () => {
        if (xhr.readyState === 4 && xhr.status === 200) {
          const response = JSON.parse(xhr.responseText);
          this.imageUrl = response.message;
        }
      }
      xhr.send();
    }
  }
}
</script>

四、原始axios请求

注:axios是对原生ajax的封装,简化了ajax请求,安装axios:npm install axios

js 复制代码
<template>
  <div>
    <el-button @click="handleClick">小狗按钮</el-button>
    <img v-if="imageUrl" :src="imageUrl" alt="狗狗图片">
  </div>
</template>

<script>
import axios from 'axios';

export default {
  data() {
    return {
      imageUrl: ''
    };
  },
  methods: {
    handleClick() {
      axios.get('https://dog.ceo/api/breeds/image/random')
        .then(response => {
          this.imageUrl = response.data.message;
        })
        .catch(error => {
          console.error(error);
        });
    }
  }
}
</script>

五、axiose二次封装请求

可以在设置请求拦截器响应拦截器;比如在请求拦截器中,在请求头中添加token,一次操作后续都可以用;在响应拦截器中,对后端返回的状态码进行判断并做相应处理

5.1、首先,创建一个request.js文件,并在其中封装Axios相关的方法(一般放在 src/utils/request.js)

js 复制代码
import axios from 'axios';

const instance = axios.create({
  baseURL: 'https://dog.ceo/api',
  timeout: 5000 // 超时时间
});

// 请求拦截器  前端 => 后端传输
instance.interceptors.request.use(
  config => {
    // 根据需要添加请求的配置,比如在请求头中添加token等
    return config;
  },
  error => {
    return Promise.reject(error);
  }
);

// 响应拦截器  后端 => 前端传输
instance.interceptors.response.use(
  response => {
    // 在这里可以对响应做一些处理,比如统一的错误处理等
    return response;
  },
  error => {
    return Promise.reject(error);
  }
);

export default instance;

5.2、在需要发送请求的组件中,导入该request.js文件,并使用封装的Axios方法发送请求:

js 复制代码
<template>
  <div>
    <el-button @click="handleClick">小狗按钮</el-button>
    <img v-if="imageUrl" :src="imageUrl" alt="狗狗图片">
  </div>
</template>

<script>
import request from '@/request.js';

export default {
  data() {
    return {
      imageUrl: ''
    };
  },
  methods: {
    handleClick() {
      request.get('/breeds/image/random')
        .then(response => {
          this.imageUrl = response.data.message;
        })
        .catch(error => {
          console.error(error);
        });
    }
  }
}
</script>

六、api解耦封装请求

在对axios进行二次封装的前提下(已有request,js文件),对组件上的请求路径进行归类封装,如部门管理模块的所有接口都放在dept.js文件下,登录相关接口都放在login.js文件下。把请求路径都封装成方法,方便在各个页面调用

6.1、在独立的dog.js文件中封装getDogImage方法(一般放在 src/api/...js)

js 复制代码
import request from "@/utils/request";

// 查询小狗
export function getList(data) {
  return request({
    url: "/breeds/image/random/list",
    method: "get",
    params: data,
  });
}

// 新增小狗
export function add(data) {
  return request({
    url: "/breeds/image/random/add",
    method: "post",
    data: data,
  });
}

// 删除小狗
export function Delete(data) {
  return request({
    url: "/breeds/image/random/del",
    method: "post",
    data: data,
  });
}

// 编辑小狗
export function update(data) {
  return request({
    url: "/breeds/image/random/edit",
    method: "post",
    data: data,
  });
}

6.2、在需要调用dog.jsgetList方法的组件中,导入它并调用即可

js 复制代码
<template>
  <div>
    <el-button @click="handleClick">小狗按钮</el-button>
    <img v-if="imageUrl" :src="imageUrl" alt="狗狗图片">
  </div>
</template>

<script>
import { getList } from '@/api/dog.js';

export default {
  data() {
    return {
      imageUrl: ''
    };
  },
  methods: {
    handleClick() {
      getList()
        .then(res => {
          this.imageUrl = res.data.message;
        })
        .catch(error => {
          console.error(error);
        });
    }
  }
}
</script>

七、总结

在公司级项目中,对于后端请求一般都采用 api解耦封装请求 方式,即 在@/utils/request.js下有axios二次封装的文件、@/api/...js下有请求路径封装为方法的文件,并且是按模块分好类;在需要掉接口的组件页面,引入封装好的请求方法,进行后端交互。

相关推荐
问道飞鱼几秒前
【前端知识】强大的js动画组件anime.js
开发语言·前端·javascript·anime.js
k09332 分钟前
vue中proxy代理配置(测试一)
前端·javascript·vue.js
傻小胖3 分钟前
React 脚手架使用指南
前端·react.js·前端框架
程序员海军16 分钟前
2024 Nuxt3 年度生态总结
前端·nuxt.js
m0_7482567826 分钟前
SpringBoot 依赖之Spring Web
前端·spring boot·spring
web135085886351 小时前
前端node.js
前端·node.js·vim
m0_512744641 小时前
极客大挑战2024-web-wp(详细)
android·前端
若川1 小时前
Taro 源码揭秘:10. Taro 到底是怎样转换成小程序文件的?
前端·javascript·react.js
潜意识起点1 小时前
精通 CSS 阴影效果:从基础到高级应用
前端·css
奋斗吧程序媛1 小时前
删除VSCode上 origin/分支名,但GitLab上实际上不存在的分支
前端·vscode