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

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

相关推荐
kyriewen1 小时前
程序员连夜带团队跑路,省了23万:这AI太贵,真的用不起了
前端·javascript·openai
kyriewen1 小时前
你写的代码没有测试,就像出门不锁门——Jest + Testing Library 从入门到不慌
前端·单元测试·jest
yuzhiboyouye2 小时前
web前端英语面试
前端·面试·状态模式
canonical_entropy3 小时前
下一代低代码渲染框架 nop-chaos-flux 的设计原则
前端·低代码·前端框架
东方小月4 小时前
5分钟搞懂Harness Engineering(驾驭工程):从提示词到AI Agent的进化之路
前端·后端·架构
我叫黑大帅4 小时前
为什么需要 @types/react?解决“无法找到模块 react 的声明文件”报错
前端·javascript·面试
之歆4 小时前
DAY_21JavaScript 深度解析:数组(Array)与函数(Function)(一)
前端·javascript
XinZong5 小时前
【AI社交】基于OpenClaw自研轻量化AI社交平台实战
前端
Le_ee5 小时前
ctfweb:php/php短标签/.haccess+图片马/XXE
开发语言·前端·php
爱上好庆祝5 小时前
学习js的第七天(wed APIs的开始)
前端·javascript·css·学习·html·css3