Як відправити HTTP-запит з Node.js?
1. Сучасний спосіб - fetch() (Node.js 18+)
Починаючи з Node.js 18, глобально доступний стандартний fetch(),
точно такий самий, як у браузері.
const res = await fetch('https://api.example.com/data', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name: 'Tim', age: 30 }),
});
const data = await res.json();
console.log(data);Переваги:
- працює без додаткових бібліотек;
- повертає Promise;
- підтримує
async/await; - вміє
GET,POST,PUT,DELETE,PATCH; - автоматично підтримує HTTP/HTTPS, stream body, JSON тощо.
Важливо: якщо в тебе Node <18, потрібно встановити пакет:
npm install node-fetchі імпортувати:
import fetch from 'node-fetch';2. Низькорівневий спосіб - http.request() / https.request()
Якщо тобі потрібно більше контролю (заголовки, стрімінг, обробка chunk'ів),
використовуй вбудований модуль node:http чи node:https.
Приклад GET-запиту:
import http from 'node:http';
const options = {
hostname: 'example.com',
path: '/data',
method: 'GET',
};
const req = http.request(options, (res) => {
let body = '';
res.on('data', (chunk) => (body += chunk));
res.on('end', () => console.log('Відповідь:', body));
});
req.on('error', (err) => console.error('Помилка:', err));
req.end();Приклад POST-запиту:
import https from 'node:https';
const data = JSON.stringify({ name: 'Tim' });
const options = {
hostname: 'api.example.com',
path: '/users',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Content-Length': Buffer.byteLength(data),
},
};
const req = https.request(options, (res) => {
let body = '';
res.on('data', (chunk) => (body += chunk));
res.on('end', () => console.log('Відповідь:', body));
});
req.on('error', (err) => console.error(err));
req.write(data);
req.end();Тут ти вручну керуєш усім: заголовками, тілом, кодом статусу, а тіло відповіді читаєш як потік.
3. Потокове завантаження (через pipeline)
Ти можеш використовувати fetch() чи http.get() разом зі стрімами,
наприклад, щоб завантажити файл без завантаження в пам'ять цілком:
import { createWriteStream } from 'node:fs';
import { pipeline } from 'node:stream/promises';
const res = await fetch('https://example.com/image.jpg');
await pipeline(res.body, createWriteStream('image.jpg'));
console.log('Файл збережено');4. Через сторонні бібліотеки (для зручності)
Якщо тобі потрібен функціонал на кшталт перехоплювачів, таймаутів, автоматичного JSON і retry - використовуй одну з популярних бібліотек:
Axios
npm install axiosimport axios from 'axios';
const res = await axios.post('https://api.example.com/users', { name: 'Tim' });
console.log(res.data);- Автоматично серіалізує JSON
- Легко обробляє помилки й статуси
- Підтримує interceptors, таймаути, cookie, multipart тощо
Got
npm install gotimport got from 'got';
const res = await got.post('https://api.example.com/users', {
json: { name: 'Tim' },
responseType: 'json',
});
console.log(res.body);5. Що обрати
| Підхід | Коли використовувати |
|---|---|
fetch() | 95% випадків - стандарт, сучасно, просто |
http.request() | Коли потрібен повний контроль (заголовки, сокети, потоки) |
axios / got | Коли проєкт великий, потрібен зручний API і перехоплювачі |
pipeline() | Для стрімінгових файлів (завантаження, скачування) |
6. Коротко
У Node.js можна відправити HTTP-запит:
- сучасно:
fetch()(вбудовано з Node 18);- низькорівнево: через
http.request()/https.request();- зручно: через
axiosчиgot.Усе залежить від того, чи хочеш ти простоту (
fetch) чи максимальний контроль (request).
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.