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": [...]
}

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

相关推荐
恋猫de小郭31 分钟前
Android Studio Cloud 正式上线,不只是 Android,随时随地改 bug
android·前端·flutter
清岚_lxn5 小时前
原生SSE实现AI智能问答+Vue3前端打字机流效果
前端·javascript·人工智能·vue·ai问答
ZoeLandia5 小时前
Element UI 设置 el-table-column 宽度 width 为百分比无效
前端·ui·element-ui
橘子味的冰淇淋~6 小时前
解决 vite.config.ts 引入scss 预处理报错
前端·vue·scss
小小小小宇8 小时前
V8 引擎垃圾回收机制详解
前端
lauo8 小时前
智体知识库:ai-docs对分布式智体编程语言Poplang和javascript的语法的比较(知识库问答)
开发语言·前端·javascript·分布式·机器人·开源
拉不动的猪8 小时前
设计模式之------单例模式
前端·javascript·面试
一袋米扛几楼989 小时前
【React框架】什么是 Vite?如何使用vite自动生成react的目录?
前端·react.js·前端框架
Alt.99 小时前
SpringMVC基础二(RestFul、接收数据、视图跳转)
java·开发语言·前端·mvc
lorogy9 小时前
【VSCode配置】运行springboot项目和vue项目
vue.js·spring boot·vscode