@edgefirst-dev/api-client - v0.0.0

@edgefirst-dev/api-client

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