当前位置: 首页 > news >正文

前端手记(二):Axios 封装与 FastAPI 联调

所属项目:面向全场景用药安全的医师助手 Agent
团队:ColdX · 山东大学软件学院 2026年春季项目实训
个人分工:前端开发 & 界面设计

目录

    • 一、背景说明
    • 二、Axios 封装设计
      • 2.1 实例化与基础配置
      • 2.2 请求拦截器
      • 2.3 响应拦截器
    • 三、接口封装
    • 四、联调中的关键问题
      • 4.1 CORS 预检失败
      • 4.2 字段命名不一致
      • 4.3 请求超时
    • 五、与 Pinia 的协作模式
    • 六、小结
    • 相关链接

一、背景说明

上篇确定了技术栈:Vue 3 + Pinia + Vite。后端使用 FastAPI,前端通过 HTTP 请求调用 Agent 接口。

首先需要落地的是网络层。表面上只是封装 Axios 并配置拦截器,但在实际联调过程中遇到了一些非预期问题,其中一部分甚至来自协作层面。

本文记录 Axios 封装过程及与 FastAPI 联调时的关键问题与解决方案。


二、Axios 封装设计

2.1 实例化与基础配置

文件:src/api/request.js

importaxiosfrom'axios'constrequest=axios.create({baseURL:import.meta.env.VITE_API_BASE_URL||'/api',timeout:30000,headers:{'Content-Type':'application/json',},})exportdefaultrequest

环境变量配置(.env.development):

VITE_API_BASE_URL=/api

配合vite.config.js中的代理配置,可以避免在前端硬编码后端地址。


2.2 请求拦截器

功能:

  • 注入 token
  • 开发环境日志输出
request.interceptors.request.use((config)=>{consttoken=localStorage.getItem('access_token')if(token){config.headers.Authorization=`Bearer${token}`}if(import.meta.env.DEV){console.log(`[Request]${config.method?.toUpperCase()}${config.url}`,config.data)}returnconfig},(error)=>Promise.reject(error))

2.3 响应拦截器

后端统一返回格式:

{"code":200,"message":"success","data":{}}

但 Agent 接口(/consult)直接返回业务数据,因此需要区分处理。

request.interceptors.response.use((response)=>{const{config,data}=responseif(config.url?.startsWith('/consult')){returndata}if(data.code!==200){consterror=newError(data.message||'请求失败')error.code=data.codereturnPromise.reject(error)}returndata.data},(error)=>{if(error.code==='ECONNABORTED'||error.message.includes('timeout')){console.error('请求超时,请稍后重试')}elseif(error.response){const{status}=error.responseif(status===401){console.warn('未授权')}elseif(status===500){console.error('服务器错误')}}returnPromise.reject(error)})

三、接口封装

文件:src/api/consult.js

importrequestfrom'./request'exportfunctionconsult(payload){returnrequest({url:'/consult',method:'post',data:payload,})}

示例请求参数:

{symptoms:"患者主诉文本",patient_info:{age:45,gender:"female"}}

四、联调中的关键问题

4.1 CORS 预检失败

问题:前端报 CORS 错误,后端声称已配置。

原因:

  • 使用Content-Type: application/json
  • 存在自定义 Header
  • 触发 OPTIONS 预检请求
  • 后端未正确处理 OPTIONS

解决方案:

app.add_middleware(CORSMiddleware,allow_origins=["*"],allow_credentials=True,allow_methods=["*"],allow_headers=["*"],)

4.2 字段命名不一致

问题:

  • 部分字段使用下划线命名
  • 部分字段使用驼峰命名
  • 前端解析失败导致页面异常

解决方案:

  • 与后端统一命名规范(最终统一为下划线)
  • 在 store 层增加字段映射(防御性处理)

4.3 请求超时

问题:

  • 初始 timeout 为 10 秒
  • Agent 推理耗时较长
  • 请求被中断

解决方案:

  • timeout 调整为 30 秒
  • 增加 loading 状态提示用户

五、与 Pinia 的协作模式

通过 store 封装调用逻辑,避免组件直接操作请求。

import{consult}from'@/api/consult'exportconstuseConsultationStore=defineStore('consultation',{actions:{asyncsubmitConsultation(payload){try{constdata=awaitconsult(payload)this.processAgentResponse(data)return{success:true,status:data.status}}catch(error){console.error('会诊请求失败',error)return{success:false,error:error.message}}}}})

组件使用方式:

conststore=useConsultationStore()constresult=awaitstore.submitConsultation({symptoms:'...'})

这种设计将网络层完全隔离,组件只关注业务状态。


六、小结

本文主要内容:

  • Axios 实例与拦截器设计
  • 普通接口与 Agent 接口的差异化处理
  • 接口函数封装方式
  • 三个联调问题:CORS、字段规范、超时
  • 网络层与 Pinia 的协作模式

当前网络层已稳定,可支持后续接口扩展。


相关链接

  • 项目地址:https://gitee.com/aemond/innovation-training/tree/master
  • 团队博客:https://blog.csdn.net/curufin/category_13140668.html
http://www.jsqmd.com/news/669599/

相关文章:

  • 2026年靠谱的低噪音电机/电机定制/螺杆真空泵配套电机/定制化电机公司口碑推荐 - 行业平台推荐
  • AGI自主编写0day Exploit仅需23秒?实测GPT-5、Claude-4、Qwen-AGI在CVE-2024-XXXX系列漏洞上的武器化效率对比
  • 丹青幻境在儿童美育中的应用:AI辅助古诗配画与想象力激发教学实践
  • CSS如何解决栅格重叠问题_使用Grid-area明确划分元素占位
  • 从Arduino到树莓派:玩转开源硬件,你的‘地’接对了吗?避坑指南与实测对比
  • Pixel Language Portal 开发环境搭建:Windows 系统下 Visual Studio 与 Python 联调指南
  • 通义千问1.8B智能写作助手:快速部署教程,帮你生成营销文案和产品介绍
  • 2026年知名的四川机制岩棉净化板/四川机制中空玻镁净化板/净化板/机制硅岩净化板制造厂家推荐 - 行业平台推荐
  • 2026年评价高的全自动伺服压装机/伺服压装机/台式伺服压装机/半自动伺服压装机销售厂家推荐 - 行业平台推荐
  • 如何用 dispatchEvent 在 window 全局触发自定义的消息通知
  • 如何解决企业微信防封行业高封号率痛点
  • 2026年环境科学论文降AI工具推荐:环境评估和生态研究部分处理方案
  • 2026年比较好的浙江不锈钢拖把管/304材质不锈钢拖把管/金华不锈钢拖把管/园林工具不锈钢拖把管批量采购厂家推荐 - 品牌宣传支持者
  • 别让学习曲线劝退用户!6个原则做好体验设计
  • 2026年质量好的轧平钢板网/菱形钢板网厂家推荐 - 品牌宣传支持者
  • 2026年口碑好的高压电线缆/线缆/山东高压电线缆/山东铜芯线缆公司推荐 - 行业平台推荐
  • 别再死记硬背了!用Python代码实现NFA到DFA的转换(附完整源码)
  • Mem0私有化部署
  • 腾兴热点 | 马斯克打造超级计算机集群 小鹏从车企到AI集团 游宝阁用户突破5千万 Sora负责人离职
  • Unity URP项目Post Processing后处理实战:从基础配置到动态效果控制
  • 实测DeepSeek-OCR-2:复杂文档识别效果展示,准确率令人惊喜
  • 2026年质量好的环氧地坪/防静电环氧地坪/聚氨酯环氧地坪高口碑品牌推荐 - 行业平台推荐
  • 2026年口碑好的特种电缆/山东高压电线电缆/山东控制电线电缆/电力电线电缆实力品牌厂家推荐 - 品牌宣传支持者
  • 看雪靶场系列--KCTF2023_签到题--生死较量--解说
  • 2026年靠谱的企业级NAS存储服务器/定制化服务器/高密度存储服务器工厂直供推荐 - 行业平台推荐
  • 深度解析WaveTools架构:构建《鸣潮》游戏性能优化与数据分析的专业工具箱
  • Wan2.2-I2V-A14B私有部署镜像:5分钟一键启动,小白也能玩转文生视频
  • Java CompletableFuture 异步执行逻辑
  • 2026年正规的嘉兴固化地坪/固化地坪/固化剂地坪优质供应商推荐 - 品牌宣传支持者
  • 2026年质量好的吊扇电机全自动装配线组装/半自动吊扇电机全自动装配线口碑好的厂家推荐 - 行业平台推荐