TypeScript 的 HTTP 客户端:现代 Web 应用顶级库
TypeScript 已牢固地占据了前端和 Node.js 服务器端应用开发主要语言的地位。每个开发者都会遇到的关键任务之一是向 API 发送 HTTP 请求。选择合适的 HTTP 客户端会影响性能、代码可读性和调试便利性。在本文中,我们将分析用于 TypeScript 中 HTTP 操作的顶级库、它们的特点、优势,并提供实用的代码示例。
1. Axios — 通用标准
Axios 仍然是浏览器和 Node.js 中最流行的 HTTP 客户端。其主要优势是开箱即用的丰富功能:支持拦截器(interceptors)、自动 JSON 转换、请求取消和 XSRF 保护。
在 TypeScript 中,Axios 的集成几乎完美。您可以使用泛型对响应进行类型化,使代码安全且可预测。
import axios, { AxiosResponse } from 'axios';
interface User { id: number; name: string; email: string;}
async function fetchUser(id: number): Promise<User> { const response: AxiosResponse<User> = await axios.get<User>(`/api/users/${id}`); return response.data;}
// 使用fetchUser(1).then(user => console.log(user.name));优点:庞大的社区、大量示例、支持上传进度、内置错误处理。
缺点:对于简单项目来说,包体积(gzip 后约 14 KB)可能过大。
2. Fetch API — 原生选择
内置于浏览器的 Fetch API 近年来已成为 XMLHttpRequest 的全面替代品。对于 TypeScript 开发者来说,这意味着没有额外的依赖。然而,原生 Fetch 需要更多手动操作:在 4xx/5xx 状态码时不会自动抛出错误,并且在 Node.js 中需要 polyfill。
interface Post { userId: number; id: number; title: string; body: string;}
async function getPosts(): Promise<Post[]> { const response = await fetch('https://jsonplaceholder.typicode.com/posts'); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } return response.json() as Promise<Post[]>;}
getPosts().then(posts => console.log(posts[0].title));优点:零包体积、完全支持 Streams API、基于 Promise 的架构。
缺点:需要手动检查响应状态、默认没有超时、取消请求复杂(需使用 AbortController)。
3. Got — Node.js 的强大工具
Got 库专为 Node.js 服务器端环境而创建。它提供高级功能:支持 HTTP/2、重试机制、缓存、cookie 和代理操作。对于 TypeScript,Got 提供了出色的类型定义。
import got from 'got';
interface ApiResponse { status: string; data: { id: number; value: string; };}
async function fetchData(): Promise<ApiResponse> { const response = await got.get('https://api.example.com/data', { responseType: 'json', retry: { limit: 3 }, timeout: { request: 5000 } }).json<ApiResponse>(); return response;}
fetchData().then(result => console.log(result.data.value));优点:丰富的 API 适用于复杂场景、内置错误处理、支持流、优秀的文档。
缺点:不能在浏览器中运行、体积相对较大(gzip 后约 10 KB)、对于简单的 GET 请求来说过于臃肿。
4. Ky — 轻量且现代
Ky 是一个基于 Fetch API 构建的极简 HTTP 客户端。它解决了原生 Fetch 的主要问题:增加了超时、重试和自动 JSON 处理等功能。