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

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

🌐 前端开发必备: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 09:30:04 +0800 CST
Nginx rewrite 的用法
2024-11-18 22:59:02 +0800 CST
thinkphp分页扩展
2024-11-18 10:18:09 +0800 CST
CSS 中的 `scrollbar-width` 属性
2024-11-19 01:32:55 +0800 CST
php腾讯云发送短信
2024-11-18 13:50:11 +0800 CST
PHP服务器直传阿里云OSS
2024-11-18 19:04:44 +0800 CST
一个有趣的进度条
2024-11-19 09:56:04 +0800 CST
Vue3中的Store模式有哪些改进?
2024-11-18 11:47:53 +0800 CST
Manticore Search:高性能的搜索引擎
2024-11-19 03:43:32 +0800 CST
使用xshell上传和下载文件
2024-11-18 12:55:11 +0800 CST
Elasticsearch 聚合和分析
2024-11-19 06:44:08 +0800 CST
基于Flask实现后台权限管理系统
2024-11-19 09:53:09 +0800 CST
任务管理工具的HTML
2025-01-20 22:36:11 +0800 CST
HTML + CSS 实现微信钱包界面
2024-11-18 14:59:25 +0800 CST
Vue3中的自定义指令有哪些变化?
2024-11-18 07:48:06 +0800 CST
Go 如何做好缓存
2024-11-18 13:33:37 +0800 CST
解决python “No module named pip”
2024-11-18 11:49:18 +0800 CST
程序员茄子在线接单