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

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

🌐 前端开发必备: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 请求,写出更专业的前端代码!

推荐文章

PyMySQL - Python中非常有用的库
2024-11-18 14:43:28 +0800 CST
一些实用的前端开发工具网站
2024-11-18 14:30:55 +0800 CST
Python Invoke:强大的自动化任务库
2024-11-18 14:05:40 +0800 CST
对多个数组或多维数组进行排序
2024-11-17 05:10:28 +0800 CST
Vue 中如何处理跨组件通信?
2024-11-17 15:59:54 +0800 CST
实用MySQL函数
2024-11-19 03:00:12 +0800 CST
回到上次阅读位置技术实践
2025-04-19 09:47:31 +0800 CST
go命令行
2024-11-18 18:17:47 +0800 CST
Go 中的单例模式
2024-11-17 21:23:29 +0800 CST
四舍五入五成双
2024-11-17 05:01:29 +0800 CST
如何优化网页的 SEO 架构
2024-11-18 14:32:08 +0800 CST
程序员茄子在线接单