编程 前端开发必备:Fetch GET 与 POST 请求封装实践与进阶优化

2025-07-16 17:16:34 +0800 CST views 710

🌐 前端开发必备:Fetch GET 与 POST 请求封装实践与进阶优化

🚀 优雅处理 HTTP 请求,从封装 Fetch 开始

随着现代 Web 开发的发展,Fetch API 已成为处理 HTTP 请求的主流方式。相比传统的 XMLHttpRequestFetch 更加简洁、语义清晰,并且天然支持 Promiseasync/await,极大提升了异步代码的可读性。

但在实际开发中,我们往往需要重复配置 headers、捕获异常、处理返回数据,代码重复度高、维护成本大。因此,本文将带你从 基础封装进阶增强,一步步构建你自己的 Fetch 请求工具库。


🧱 为什么要封装 Fetch?

使用原始 Fetch 的痛点:

const res = await fetch("/api/user", { method: "GET" });
if (!res.ok) throw new Error("请求失败");
const data = await res.json();

看起来简单?但实际项目中你会频繁:

  • 添加 headers(如 Token、Content-Type)
  • 判断 status、统一处理错误
  • 加 loading 状态
  • 多处复制粘贴相似逻辑

为了提升开发效率、降低重复度、提高维护性,我们有必要对 Fetch 进行封装。


📦 一步步封装 GET 和 POST 请求

✅ GET 请求封装

const $GET = async (
  url: string,
  headers: Record<string, string> = {}
): Promise<any> => {
  try {
    const res = await fetch(url, {
      method: "GET",
      headers,
    });
    if (!res.ok) throw new Error(`HTTP error! Status: ${res.status}`);
    return await res.json();
  } catch (error) {
    console.error("GET request failed:", error);
    throw error;
  }
};

✅ POST 请求封装

const $POST = async (
  url: string,
  data: Record<string, any>,
  headers: Record<string, string> = { "Content-Type": "application/json" }
): Promise<any> => {
  try {
    const res = await fetch(url, {
      method: "POST",
      headers,
      body: JSON.stringify(data),
    });
    if (!res.ok) throw new Error(`HTTP error! Status: ${res.status}`);
    return await res.json();
  } catch (error) {
    console.error("POST request failed:", error);
    throw error;
  }
};

🧪 使用示例

获取用户信息

$GET("https://api.example.com/user")
  .then(data => console.log("用户信息:", data))
  .catch(err => alert("获取失败"));

登录请求

$POST("https://api.example.com/login", {
  username: "admin",
  password: "123456"
})
  .then(res => console.log("登录成功", res))
  .catch(err => alert("登录失败"));

🔧 进阶增强:更实用的封装建议

1. 自动附加 Token

const getToken = () => localStorage.getItem("token");

const withAuthHeader = (headers: Record<string, string> = {}) => ({
  ...headers,
  Authorization: `Bearer ${getToken()}`,
});

将其集成进封装函数中:

const $GET = async (url: string, headers = {}) =>
  fetch(url, {
    method: "GET",
    headers: withAuthHeader(headers),
  });

2. 统一错误处理

你可以在封装函数中加入状态码判断逻辑,例如:

if (res.status === 401) {
  // 跳转登录页或刷新 token
}

或者配合全局处理:

window.addEventListener("unhandledrejection", event => {
  alert("系统异常:" + event.reason?.message || "未知错误");
});

3. 添加 Loading 状态(可选)

配合前端框架如 React/Vue,你可以用 loading 状态管理器(如 Zustand、Pinia)在请求前后自动控制加载 UI。


✅ 总结

封装 HTTP 请求,是前端项目中提高代码质量与维护效率的重要实践。本文基于 Fetch API,提供了:

  • GET 与 POST 的基础封装方法;
  • 错误处理、Token 附加、Loading 控制等增强技巧;
  • 实用开发建议,助你构建更优雅的网络请求工具库。

从今天起,告别冗余的 fetch 请求,写出更专业的前端代码!

推荐文章

前端代码规范 - 图片相关
2024-11-19 08:34:48 +0800 CST
Vue3中如何实现国际化(i18n)?
2024-11-19 06:35:21 +0800 CST
Rust async/await 异步运行时
2024-11-18 19:04:17 +0800 CST
用 Rust 构建一个 WebSocket 服务器
2024-11-19 10:08:22 +0800 CST
JS中 `sleep` 方法的实现
2024-11-19 08:10:32 +0800 CST
markdown语法
2024-11-18 18:38:43 +0800 CST
Vue3 中提供了哪些新的指令
2024-11-19 01:48:20 +0800 CST
npm速度过慢的解决办法
2024-11-19 10:10:39 +0800 CST
Linux 网站访问日志分析脚本
2024-11-18 19:58:45 +0800 CST
Go 开发中的热加载指南
2024-11-18 23:01:27 +0800 CST
Vue中的表单处理有哪几种方式?
2024-11-18 01:32:42 +0800 CST
Elasticsearch 聚合和分析
2024-11-19 06:44:08 +0800 CST
Web 端 Office 文件预览工具库
2024-11-18 22:19:16 +0800 CST
7种Go语言生成唯一ID的实用方法
2024-11-19 05:22:50 +0800 CST
Redis和Memcached有什么区别?
2024-11-18 17:57:13 +0800 CST
Golang 中应该知道的 defer 知识
2024-11-18 13:18:56 +0800 CST
程序员茄子在线接单