@ dedgefirst-dev/api-客户端
这个 APIClient class 提供灵活而可扩展的 HTTP 客户端,用于提出 API 请求. 它支持常见的HTTP方法(GET, (中文(简体) ), POST, (中文(简体) ), PUT, (中文(简体) ), PATCH, (中文(简体) ), DELETE并允许通过 before 财务报告和审定财务报表 after 截取钩.
安装
bun add @edgefirst-dev/api-client
使用量
导入 APIClient ,并创建一个新实例来提出 API 请求.
import { APIClient } from "@edgefirst-dev/api-client";
let client = new APIClient("https://api.example.com");
let response = await client.get("/users/1");
自定义
您可以通过扩展 : APIClient 阶级和压倒性 before 财务报告和审定财务报表 after 方法。 。 .
class CustomAPIClient extends APIClient {
async before(request: Request) {
// Add a custom header to the request
request.headers.set("X-Custom-Header", "value");
return request;
}
async after(request: Request, response: Response) {
if (response.status === 401) {
// Handle unauthorized error
throw new Error("Unauthorized");
}
return response;
}
}
let client = new CustomAPIClient("https://api.example.com");
let response = await client.get("/users/1");
也可以定义子类中的自定义方法来封装常见的API调用.
import { ObjectParser } from "@edgefirst-dev/data/parser";
class CustomAPIClient extends APIClient {
async fetchUserData(id: number) {
let response = await this.get(`/users/${id}`);
let data = await response.json();
return new ObjectParser(data);
}
}
let client = new CustomAPIClient("https://api.example.com");
let user = await client.fetchUserData(1);
let userName = user.string("name");
通过压倒构造器,您可以提供默认的基础 URL .
class CustomAPIClient extends APIClient {
constructor() {
super("https://api.example.com");
}
}
let client = new CustomAPIClient();
拦截
你可以增加拦截器 APIClient 实例来定制请求和响应处理.
let client = new APIClient("https://api.example.com");
client.interceptors.before.on(async (request) => {
// Add a custom header to the request
request.headers.set("X-Custom-Header", "value");
return request;
});
client.interceptors.after.on(async (request, response) => {
if (response.status === 401) {
// Handle unauthorized error
throw new Error("Unauthorized");
}
return response;
});
也可以使用 off 方法.
async function beforeInterceptor(request) {
// Add a custom header to the request
request.headers.set("X-Custom-Header", "value");
return request;
}
let client = new APIClient("https://api.example.com");
client.interceptors.before.on(beforeInterceptor); // Add the interceptor
client.interceptors.before.off(beforeInterceptor); // Remove the interceptor
子类拦截器在实例拦截器之前运行.
class CustomAPIClient extends APIClient {
async before(request: Request) {
// Add a custom header to the request
request.headers.set("X-Custom-Header", "1");
return request;
}
}
let client = new CustomAPIClient("https://api.example.com");
client.interceptors.before.on(async (request) => {
// Add a custom header to the request
request.headers.set("X-Custom-Header", "2");
return request;
});
给 X-Custom-Header 将设定为 2 在请求中,因为实例截取器覆盖了子类截取器设定的头部.
测试
您可以轻松地测试您的 API 通话 APIClient 与 质量 来嘲笑API的反应.
import { http, HttpResponse } from "msw";
import { setupServer } from "msw/native"; // or "msw/node" or "msw/browser"
let server = setupServer(
http.get("https://api.example.com/users/1", (req, res, ctx) => {
return res(ctx.json({ id: 1, name: "John Doe" }));
})
);
server.listen();
let client = new APIClient("https://api.example.com");
let response = await client.get("/users/1");
let data = await response.json(); // { id: 1, name: "John Doe" }
处理错误
这个 APIClient 类中,除了网络错误外,从不丢出错误。 您可以通过检查响应状态代码处理 API 错误 .
let client = new APIClient("https://api.example.com");
try {
let response = await client.get("/users/1");
if (response.status === 401) {
// Handle unauthorized error
throw new Error("Unauthorized");
}
// Handle other errors or success
} catch (error) {
// Handle network error
console.error(error);
}
或者,你可以使用 after 用于处理常见API错误的截取器.
class CustomAPIClient extends APIClient {
async after(request: Request, response: Response) {
if (response.status === 401) {
// Handle unauthorized error
throw new Error("Unauthorized");
}
return response;
}
}
或者你可以使用这个 on 用于处理常见的API错误的方法.
let client = new APIClient("https://api.example.com");
client.interceptors.after.on(async (_, response) => {
if (response.status === 401) {
// Handle unauthorized error
throw new Error("Unauthorized");
}
return response;
});
超时
您可以使用 API 请求设置超时 signal 选项.
let client = new APIClient("https://api.example.com");
await client.get("/users/1", { signal: AbortSignal.timeout(5000) });
许可证
见 自由主义