网络请求基础类通过继承实现通用能力复用,父类专注“怎么发”(超时、拦截、响应解析、取消),子类只定义“发给谁、发什么”,配合配置驱动与扩展钩子,兼顾复用性、可维护性与可扩展性。

直接用继承写网络请求基础类,核心是把通用能力抽到父类,子类只专注业务差异。不是为了用继承而继承,而是让重复逻辑归一处、扩展有路径、维护不散乱。
明确父类职责:只管“怎么发”,不管“发给谁”
基础请求类不绑定具体接口地址或业务参数,只封装共性行为:
- 统一设置超时、重试策略、默认 headers(如 token、Content-Type)
- 内置请求拦截:自动读取本地 token、拼接 base URL、生成防重放签名
- 统一响应解析:剥离 code/message/data 结构,成功返回 data,失败抛出带语义的异常(如 AuthError、NetworkTimeout)
- 支持取消请求(AbortController 或 CancelToken),供子类按需调用
子类聚焦业务:继承后只需声明“发什么、发给哪”
每个业务模块建一个子类,只覆盖必要部分,不重写整个流程:
- 重写 getBaseUrl() 返回对应环境的 API 前缀(如 user-service、order-api)
- 重写 getDefaultHeaders() 补充业务专属头(如 X-Region、X-App-Version)
- 提供类型安全的业务方法,例如 getUser(id: string),内部调用父类 get(`/users/${id}`)
- 不重复写拦截器、不手动拼 URL、不每次都判断 token 是否过期
配合配置驱动,避免硬编码分支
环境切换、Mock 开关、降级开关等,全靠配置对象控制,不在继承链里写 if-else:
- 父类构造时接收 config 对象(含 env、mock、timeout、baseUrls 等)
- 子类实例化时传入对应配置,例如 new UserService({ env: 'prod', mock: false })
- 请求方法内部根据 config.mock 自动走 axios 或 mockjs,对外接口完全一致
留好扩展钩子,后续加功能不改已有代码
为将来埋点、日志、监控、熔断等能力预留入口,不破坏现有结构:
- 父类定义空的 beforeRequest() 和 afterResponse() 钩子函数
- 子类可选择性重写,比如在 beforeRequest 中打日志或上报 traceId
- 所有子类共享同一套生命周期,新增全局能力只需改父类钩子调用位置










