news 2026/7/5 1:25:06

从 PHP 到 AI + Golang,程序员自救转型手记(二十一):网络请求封装优化

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从 PHP 到 AI + Golang,程序员自救转型手记(二十一):网络请求封装优化

这是一个系列 Blog,作者将以一个 PHP 全栈工程师的身份,利用 AI 工具(claude code、codex、deepseek、豆包等):从零开始学习 golang 语言,并最终完成 ai-go-mall(github | gitee)开源项目的制作,全程记录分享。

在上一期,我们进行了 “前端点选验证码组件实现”,本期将完成:网络请求封装优化

网络请求封装优化

请求选项使用单独的参数传递

目前,如果需要使用我们自定义的请求选项,写法如下的requestOptions

exportfunctioncheckClickCaptcha(data:ClickRequest,apiBaseURL?:string){returnrequest({url:'/common/captcha/verify',method:'POST',requestOptions:{loading:true,cancelDuplicate:true,showErrorMessage:false,},})}

即,使用request函数的第一个参数嵌套一个requestOptions来完成配置,我希望改为使用单独的参数进行传递,如下:

exportfunctioncheckClickCaptcha(data:ClickRequest){returnrequest({url:'/common/captcha/verify',method:'POST',data,},{loading:true,cancelDuplicate:true,showErrorMessage:false,})}

参数 1 是axios的请求配置,参数 2 是我们自定义的请求选项,将其独立出来可读性、类型、扩展性、维护性全方位更优;以上内容是思路,同时是提示词,直接发送给 cc:

● 重构完成。改动总结如下: 修改的文件1. src/utils/request.ts - 删除了 RequestConfig 接口(已不需要,直接使用 AxiosRequestConfig) - request 函数签名从 request(config: RequestConfig)改为 request(config: AxiosRequestConfig, options?: RequestOptions)- 内部将 options 合并到 config 的 requestOptions 字段上,拦截器逻辑无需任何改动2. src/api/common.ts - checkClickCaptcha 中的 requestOptions 从第一个参数嵌套中提取为独立的第二个参数: // 之前 request({url:'...', requestOptions:{showErrorMessage:false}})// 之后 request({url:'...'},{showErrorMessage:false})无需改动的文件 - src/api/admin/index.ts — 未使用 requestOptions,现有的单参数调用完全兼容 - 其他不涉及 requestOptions 的调用方同样无需改动,因为 AxiosRequestConfig 就是之前第一个参数去掉 requestOptions 后的类型 ✻ Bakedfor50s

人工review没发现不对的,其实总共也没改几行,反而提示词写了一大堆,失算了,😂😂

后端接口响应中的字段命名方式自动转为 camelCase

各个语言的服务端 json 字段命名,还有网络传输的惯例字段命名方式都是snake_case,但是前端一般使用camelCase访问/存储字段值,所以在网络请求封装中对命名方式进行转换是比较常见的做法,这里要求 CC 增加转换字段命名方式的开关,默认打开,然后实现这个功能:

全部完成。以下是变更总结:

变更清单
src/utils/request.ts— 核心改造

变更说明
import { camelCase }复用已有的 lodash-es,无需新依赖
convertCase?: boolean新增请求选项,默认 true(开关打开)
keysToCamelCase()递归转换函数,处理对象、数组、嵌套结构
响应拦截器 L190-193在 response.data.data 上自动执行转换

接口 + Store + 模板统一改名

文件变更
src/stores/interface/index.tslast_login_at → lastLoginAt,last_login_ip → lastLoginIp
src/stores/adminInfo.ts初始 state 同步改为 camelCase
src/layouts/admin/components/navMenu.vue模板变量引用改为 adminInfo.lastLoginAt

使用方式:

// 默认:自动转换(开关打开)

request({ url: '/admin/init', method: 'GET' })

// 某个接口不需要转换时,显式关闭

request({ url: '/some/api', method: 'GET' }, { convertCase: false })

现在前端所有接口的响应字段命名都是统一的camelCase了,不再有风格不一致的问题。

review时,我直接让它把请求时的camelCase也反向转为snake_case(受同一开关控制),至此前后端命名风格彻底解耦,本来是大型项目才标配的功能,也是让 AI 随手就搞了。

现在起:

  1. API响应snake_case将被转换为camelCase
  2. 请求API时,传递camelCase(包括dataparams)会转换为snake_case

前端可以总是使用camelCase了,非常舒服,比如:

  1. 访问响应数据时,接口返回了:res.data.data.admin_info.last_login_at字段,可以使用res.data.data.adminInfo.lastLoginAt访问响应数据;
  2. 发起请求时,data是:{data: {adminInfo: {lastLoginAt: '2023-05-01'}},将被转换为:{data: {admin_info: {last_login_at: '2023-05-01'}}发送。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/5 1:23:29

2026年联发科嵌入式岗位高频面试题带参考答案

大厂面试做到心里有数 本套题针对联发科嵌入式开发岗(覆盖芯片适配、驱动开发、系统移植、外设控制、物联网终端等方向)整理,遵循硬件模块前置、核心能力优先的考察逻辑,兼顾基础理论与项目实战,适配校招与社招面试备考。 总计:**46道** 分模块数量明细: 一、核心项目…

作者头像 李华
网站建设 2026/7/5 1:23:07

一条信息在 PowerMem 中的完整旅程,从写入到淘汰的工程拆解

存储和检索,随着数据量增长,系统会面临两个问题:检索信噪比持续下降,存储成本不可控。 香农信息论也解释了这件事:高概率事件的信息量趋近于零,不值得长期存储;低概率但关键事件的信息量极大&a…

作者头像 李华
网站建设 2026/7/5 1:22:42

提示词,上下文,RAG对llm来说都是一样的

首先我们得明确一个点,llm的本质根据前面每一个字预测下一个字,也就是自回归模型。举个例子,把“我爱”发给llm,llm会根据前前两个字预测第三个字可能是“你”,“吃”,“玩”,然后拼接成“我爱你…

作者头像 李华
网站建设 2026/7/5 1:21:37

系统调用错误处理:errno机制的线程安全与工程实践深度解析

系统调用错误处理:errno机制的线程安全与工程实践深度解析 一、errno的设计演进与线程安全革命 POSIX标准的errno看似简单却承载着核心职责。它是用户空间与内核空间错误传递的唯一桥梁。传统的全局变量实现在多线程环境下彻底失效。 flowchart TDA["用户进程调…

作者头像 李华
网站建设 2026/7/5 1:20:28

为什么说一面健康墙,七分在腻子?

装修这事儿,说起来门道一大堆。有人盯着地板砖的花纹挑了三个月,有人为了一款沙发跑遍全城家具城。可你要问他腻子选的啥牌子?十有八九一脸懵——"腻子?那不是随便买点就行吗?"还真不是。墙面这东西&#xf…

作者头像 李华
网站建设 2026/7/5 1:19:37

Diablo Edit2:暗黑破坏神2角色编辑器的完整解决方案

Diablo Edit2:暗黑破坏神2角色编辑器的完整解决方案 【免费下载链接】diablo_edit Diablo II Character editor. 项目地址: https://gitcode.com/gh_mirrors/di/diablo_edit 你是否曾在暗黑破坏神2中花费数小时刷装备,却始终无法获得理想的属性组…

作者头像 李华