universal-common-net-http
v1.0.2
Published
A lightweight HTTP library based on the fetch API.
Maintainers
Readme
universal-common-net-http
A lightweight HTTP library based on the fetch API that simplifies making HTTP requests.
Installation
npm install universal-common-net-httpOverview
This library provides three main classes to simplify HTTP requests:
HttpClient- Handles HTTP requests with a clean, fluent interface.HttpContent- Represents HTTP content bodies with associated headers (the derived type JsonContent is more commonly used with JSON APIs).HttpError- Wraps HTTP error responses with easy access to status and body.
Usage
Importing
// Commonly used types.
import { HttpClient, HttpContent, HttpError, JsonContent } from "universal-common-net-http";Basic GET Request
const client = new HttpClient();
const response = await client.getAsync("https://api.example.com/users");
const users = await response.json();
console.log(users);Handling Query Parameters
const client = new HttpClient();
const response = await client.getAsync("https://api.example.com/search?query=test&page=1");
const results = await response.json();POST Request with JSON Data
const client = new HttpClient();
import { JsonContent } from "universal-common-net-http";
const userData = {
name: "John Doe",
email: "[email protected]"
};
const jsonContent = new JsonContent(userData);
const response = await client.postAsync("https://api.example.com/users", jsonContent);
const newUser = await response.json();
console.log(`Created user with ID: ${newUser.id}`);Using Raw HttpContent
const client = new HttpClient();
const content = new HttpContent();
content.body = JSON.stringify({ name: "Jane Doe" });
content.headers = {
"Content-Type": "application/json",
"X-Custom-Header": "CustomValue"
};
const response = await client.postAsync("https://api.example.com/users", content);Working with FormData
const client = new HttpClient();
const formData = new FormData();
formData.append("username", "johndoe");
formData.append("avatar", fileInput.files[0]);
const content = new HttpContent();
content.body = formData;
const response = await client.postAsync("https://api.example.com/profile", content);Error Handling
const client = new HttpClient();
try {
const response = await client.getAsync("https://api.example.com/restricted");
const data = await response.json();
console.log(data);
} catch (error) {
if (error instanceof HttpError) {
console.error(`HTTP Error: ${error.status} - ${error.statusText}`);
try {
const errorBody = await error.json();
console.error("Error details:", errorBody);
} catch (e) {
console.error("Could not parse error response as JSON");
}
} else {
console.error("Network or other error:", error);
}
}Custom HttpClient
class ApiClient extends HttpClient {
constructor(baseUrl, apiKey) {
super();
this.baseUrl = baseUrl;
this.apiKey = apiKey;
}
preConfigureRequestOptions(uri, requestOptions) {
if (!requestOptions.headers) {
requestOptions.headers = {};
}
requestOptions.headers["Authorization"] = `Bearer ${this.apiKey}`;
}
handleNonSuccess(response) {
throw new HttpError(response);
}
async getUsersAsync() {
const response = await this.getAsync(`${this.baseUrl}/users`);
return await response.json();
}
}
const apiClient = new ApiClient("https://api.example.com/v1", "your-api-key");
const users = await apiClient.getUsersAsync();Aborting Requests
const client = new HttpClient();
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), 5000);
try {
const response = await client.getAsync(
"https://api.example.com/slow-endpoint",
controller.signal
);
clearTimeout(timeoutId);
const data = await response.json();
console.log(data);
} catch (error) {
if (error.name === "AbortError") {
console.log("Request was aborted due to timeout");
} else {
console.error("Request failed:", error);
}
}PUT and DELETE Requests
const client = new HttpClient();
const updateData = new JsonContent({ name: "Updated Name" });
const updateResponse = await client.putAsync("https://api.example.com/users/123", updateData);
const deleteResponse = await client.deleteAsync("https://api.example.com/users/123");Advanced Configuration
Custom Request Options
const client = new HttpClient();
const requestOptions = {
credentials: "include",
cache: "no-cache",
redirect: "follow",
referrerPolicy: "no-referrer"
};
const response = await client.getAsync(
"https://api.example.com/data",
null, // No abort signal
requestOptions
);