Знакомство с Node.js немыслимо без умения отправлять HTTP-запросы. Это основа для взаимодействия с внешними API, создания бэкенда для веб-приложений и многого другого. Если вы новичок и хотите разобраться, как получать данные с серверов или отправлять их, это руководство для вас.
В этой статье мы рассмотрим самые популярные способы выполнения GET и POST запросов в Node.js, с простыми и рабочими примерами кода, включая варианты на TypeScript.
Что такое GET и POST запросы?
Прежде чем мы начнем, давайте быстро разберемся в основах:
- GET-запрос: Используется для получения данных с сервера. Когда вы вводите адрес сайта в браузере, вы отправляете GET-запрос. Вся необходимая информация передается прямо в URL.
- POST-запрос: Используется для отправки данных на сервер для их создания или обновления. Например, когда вы заполняете форму регистрации на сайте и нажимаете “Отправить”, ваши данные уходят на сервер с помощью POST-запроса. Данные передаются в “теле” запроса, а не в URL.
Подготовка
Установите Node.js и пакетный менеджер npm. Для TypeScript потребуется также ts-node и typescript:
npm install -g ts-node typescript
Node-fetch
Начиная с версии Node.js 18, Fetch API доступен глобально, что делает его стандартным и удобным способом для выполнения запросов без установки сторонних библиотек. Синтаксис fetch основан на промисах и идеально сочетается с async/await.
Для Node.js v18+ установка не требуется. Для более старых версий:
npm install node-fetch
JavaScript
async function fetchData() {
try {
const response = await fetch("https://api.example.com/data");
if (!response.ok) throw new Error("Ошибка сети");
const data = await response.json();
console.log(data);
} catch (error) {
console.error("Ошибка:", error);
}
}
fetchData();
TypeScript
TypeScript добавляет безопасность типов, что очень полезно при работе с API.
interface ApiResponse {
id: number;
name: string;
}
async function fetchData(): Promise<void> {
try {
const response = await fetch("https://api.example.com/data");
if (!response.ok) throw new Error("Ошибка сети");
const data: ApiResponse = await response.json();
console.log(data);
} catch (error) {
console.error("Ошибка:", error);
}
}
Axios
Axios — это, пожалуй, самая популярная и удобная библиотека для HTTP-запросов. Она работает как в Node.js, так и в браузере, имеет простой синтаксис, автоматически преобразует JSON и лучше обрабатывает ошибки.
npm install axios
GET-запрос с помощью axios
Axios упрощает работу с промисами и предоставляет удобные методы.
JavaScript
const axios = require("axios");
async function getUsersWithAxios() {
try {
// .get() возвращает объект ответа, данные находятся в свойстве `data`
const response = await axios.get("https://jsonplaceholder.typicode.com/users");
console.log(response.data);
} catch (error) {
console.error("Не удалось получить пользователей:", error.message);
}
}
getUsersWithAxios();
TypeScript
import axios from "axios";
async function getUsersWithAxios() {
try {
// .get() возвращает объект ответа, данные находятся в свойстве `data`
const response: { data: User[] } = await axios.get("https://jsonplaceholder.typicode.com/users");
console.log(response.data);
} catch (error) {
console.error("Не удалось получить пользователей:", error.message);
}
}
POST-запрос с помощью axios
axios автоматически преобразует наш объект в JSON и устанавливает нужные заголовки. Отлично интегрируется с TypeScript, позволяя типизировать и запрос, и ответ.
JavaScript
const axios = require("axios");
async function createPostWithAxios() {
const newPost = {
title: "foo",
body: "bar",
userId: 1,
};
try {
// Вторым аргументом передаем данные
const response = await axios.post("https://jsonplaceholder.typicode.com/posts", newPost);
console.log("Пост успешно создан:", response.data);
} catch (error) {
console.error("Не удалось создать пост:", error.message);
}
}
createPostWithAxios();
TypeScript
import axios, { AxiosResponse } from "axios";
interface Post {
id?: number;
title: string;
body: string;
userId: number;
}
async function createPostWithAxiosTS(): Promise<void> {
const newPost: Post = {
title: "TypeScript Post",
body: "This is a test.",
userId: 5,
};
try {
// Указываем тип ожидаемого ответа
const response: AxiosResponse<Post> = await axios.post("https://jsonplaceholder.typicode.com/posts", newPost);
console.log("Post created successfully:", response.data);
} catch (error) {
if (axios.isAxiosError(error)) {
console.error("Failed to create post:", error.message);
} else {
console.error("An unexpected error occurred:", error);
}
}
}
createPostWithAxiosTS();
// PUT-запрос
await axios.put("https://api.example.com/update/1", { name: "Bob" });
// DELETE-запрос
await axios.delete("https://api.example.com/delete/1");
Встроенный модуль https (без зависимостей)
Для тех, кто хочет избежать внешних зависимостей, в Node.js есть встроенные модули http и https. Они более низкоуровневые и менее удобные, но важно знать об их существовании.
Сделать GET-запрос с помощью встроенного модуля https не вызывает сложностей, но этот способ требует больше ручной работы, например, для сборки данных из потока.
const https = require("https");
function getUsersWithNativeHttp() {
const options = {
hostname: "jsonplaceholder.typicode.com",
path: "/users",
method: "GET",
};
const req = https.request(options, (res) => {
let data = "";
// Данные приходят частями (chunks)
res.on("data", (chunk) => {
data += chunk;
});
// Когда все части получены
res.on("end", () => {
console.log(JSON.parse(data));
});
});
req.on("error", (error) => {
console.error(error);
});
req.end(); // Завершаем запрос
}
getUsersWithNativeHttp();
Что лучше?
Сравнительный анализ популярных HTTP-клиентов в Node.js
Критерий | fetch (Node.js 18+) | axios | Модуль |
|---|---|---|---|
Установка | Не требуется (встроен) | npm install axios | Не требуется (встроен) |
Простота | ✅ Высокая | ✅ Очень высокая | ❌ Низкая |
JSON | Ручное преобразование (.json()) | ✅ Автоматически | ❌ Ручное преобразование |
Обработка ошибок | Требует проверки response.ok | ✅ Встроенная | ❌ Низкоуровневая |
TypeScript | Хорошая поддержка | ✅ Отличная поддержка | Требует ручной типизации |
Лучше всего для | Быстрых скриптов, современных проектов | Большинства проектов | Простых запросов без зависимостей |
Заключение
Для новичков в Node.js Axios является лучшей отправной точкой благодаря своей простоте, отличной документации и удобным функциям. Если вы работаете с современной версией Node.js (18+) и хотите избежать лишних зависимостей, встроенный fetch — это ваш выбор. Встроенный модуль https стоит использовать только в тех редких случаях, когда внешние зависимости абсолютно недопустимы.