The APIClient
class provides a flexible and extensible HTTP client for making API requests. It supports common HTTP methods (GET
, POST
, PUT
, PATCH
, DELETE
) and allows customization of the request and response handling through the before
and after
interceptor hooks.
bun add @edgefirst-dev/api-client
Import the APIClient
and create a new instance to make API requests.
import { APIClient } from "@edgefirst-dev/api-client";
let client = new APIClient("https://api.example.com");
let response = await client.get("/users/1");
You can customize the request and response handling by extending the APIClient
class and overriding the before
and after
methods.
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(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");
You can also define custom methods in the subclass to encapsulate common API calls.
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");
By overriding the constructor, you can provide a default base URL.
class CustomAPIClient extends APIClient {
constructor() {
super("https://api.example.com");
}
}
let client = new CustomAPIClient();
You can easily test your API calls using the APIClient
with msw to mock the API responses.
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" }
See LICENSE