axios二次封装实战

首先是axios的基础封装:所有的请求都会拼接这个baseURL,另外简单设置了请求、响应拦截器。

javascript 复制代码
//axios基础封装
import axios from "axios"

//创建axios实例
const httpInstance = axios.create({
  baseURL:'http://pcapi-xiaotuxian-front-devtest.itheima.net',
  timeout:5000
})

//axios请求拦截器
httpInstance.interceptors.request.use(config=>{
  return config
},e=>Promise.reject(e))


// axios响应式拦截器
httpInstance.interceptors.response.use(res => res.data, e => {
  return Promise.reject(e)
})


export default httpInstance

然后是api调用层,实际上是将不同业务的请求地址与baseurl进行拼接。

javascript 复制代码
import httpInstance from "@/utils/http";

export function getCategory(){
  return httpInstance({
    url:'home/category/head'
  })
}

最后是调用api接口的返回结果,返回的是一个promise对象。 用then进行接收。

javascript 复制代码
import './assets/main.css'

import { createApp } from 'vue'
import { createPinia } from 'pinia'

import App from './App.vue'
import router from './router'

//测试接口函数
import { getCategory } from '@/apis/testAPI'
getCategory().then(res=>{
  console.log(res)
})
const app = createApp(App)

app.use(createPinia())
app.use(router)

app.mount('#app')

逐步梳理数据返回的整个流程:

  1. Axios实例创建 (http.js)

    javascript 复制代码
    const httpInstance = axios.create({
      baseURL: 'http://pcapi-xiaotuxian-front-devtest.itheima.net',
      timeout: 5000
    })
    • 这里创建了一个预配置的axios实例,所有通过该实例的请求都会自动拼接这个baseURL
    • 比如后续的/home/category/head请求,实际完整URL会是http://pcapi.../home/category/head
  2. 响应拦截器 (http.js关键部分)

    javascript 复制代码
    httpInstance.interceptors.response.use(res => res.data, ...)
    • 这里的关键是将响应数据直接返回res.data
    • 这意味着任何通过这个实例的请求,最终得到的都是响应体的data部分
  3. API调用层 (testAPI.js)

    javascript 复制代码
    export function getCategory(){
      return httpInstance({
        url:'home/category/head'
      })
    }
    • 调用时实际是发起一个GET请求到/home/category/head
    • 返回的是一个Promise对象
  4. 应用初始化调用 (main.js)

    javascript 复制代码
    import { getCategory } from '@/apis/testAPI'
    getCategory().then(res => {
      console.log(res)
    })
    • 在Vue应用初始化前直接调用接口
    • 当请求成功时,响应结果会经过拦截器处理后进入then回调
    • 这里的res已经是响应拦截器返回的res.data

完整数据流 : 浏览器发起请求 → 服务端响应 → axios接收响应 → 响应拦截器处理(res.data) → testAPI.js的Promise → main.js中的then回调

关键点解释

  1. 拦截器中的res => res.data帮我们自动解构了axios的响应对象
  2. 实际业务中获取的响应数据会比原生axios少一层结构
  3. main.js中的调用是立即执行的,会在应用初始化前就发起请求

示例响应过程: 假设服务端返回:

json 复制代码
{
  "status": 200,
  "data": {
    "categories": [...]
  }
}

经过拦截器处理后,最终得到的res就是:

json 复制代码
{
  "categories": [...]
}

这种封装方式让业务层的代码更简洁,不需要每次处理响应数据结构,同时统一管理了基础配置和错误处理。

相关推荐
LYFlied1 小时前
从 Vue 到 React,再到 React Native:资深前端开发者的平滑过渡指南
vue.js·react native·react.js
爱喝白开水a1 小时前
前端AI自动化测试:brower-use调研让大模型帮你做网页交互与测试
前端·人工智能·大模型·prompt·交互·agent·rag
董世昌411 小时前
深度解析ES6 Set与Map:相同点、核心差异及实战选型
前端·javascript·es6
B站_计算机毕业设计之家1 小时前
豆瓣电影数据采集分析推荐系统 | Python Vue Flask框架 LSTM Echarts多技术融合开发 毕业设计源码 计算机
vue.js·python·机器学习·flask·echarts·lstm·推荐算法
吃杠碰小鸡2 小时前
高中数学-数列-导数证明
前端·数学·算法
kingwebo'sZone2 小时前
C#使用Aspose.Words把 word转成图片
前端·c#·word
xjt_09013 小时前
基于 Vue 3 构建企业级 Web Components 组件库
前端·javascript·vue.js
我是伪码农3 小时前
Vue 2.3
前端·javascript·vue.js
夜郎king3 小时前
HTML5 SVG 实现日出日落动画与实时天气可视化
前端·html5·svg 日出日落
跳动的梦想家h4 小时前
环境配置 + AI 提效双管齐下
java·vue.js·spring