Node.js GET/POST-запросы
Во многих сценариях нашему серверу необходимо взаимодействовать с браузером пользователя, например при отправке формы.
Для отправки форм на сервер обычно используются GET/POST-запросы.
В этой главе мы рассмотрим GET/POST-запросы Node.js.
Получение содержимого GET-запроса
Поскольку GET-запросы напрямую встроены в путь, URL — это полный путь запроса, включая?часть после `?`, поэтому вы можете вручную разобрать содержимое после него как параметры GET-запроса.
В node.js можно использовать конструктор URL для разбора URL запроса.
Объект URL — это стандартный инструмент в Node.js для разбора и обработки URL-адресов. Он предоставляет удобный интерфейс для доступа к различным компонентам URL и их изменения, таким как протокол, имя хоста, путь, параметры запроса и т. д.
Пример
Откройте в браузереhttp://localhost:3000/user?name=Example&url=www.example.comЗатем просмотрите возвращённый результат:

Получение параметров URL
Мы можем использовать метод url.parse для разбора параметров в URL. Код выглядит так:
Пример
Откройте в браузереhttp://localhost:3000/user?name=Example&url=www.example.comЗатем просмотрите возвращённый результат:

Объект URL
Ниже перечислены свойства и методы объекта URL:
| Свойство/Метод | Описание | Пример вывода |
|---|---|---|
| href | Полная строка URL | "http://example.com:8080/path?foo=bar#section" |
| origin | Источник URL, включая протокол, имя хоста и номер порта (если присутствует) | "http://example.com:8080" |
| protocol | Часть URL, содержащая протокол, за которой следует: | "http:" |
| host | имя хоста и номер порта | "example.com:8080" |
| hostname | Имя хоста, исключая номер порта | "example.com" |
| port | Номер порта (если указан) | "8080" |
| pathname | Часть пути | "/path" |
| search | Часть строки запроса, включая ведущий? | "?foo=bar&hello=world" |
| searchParams | URLSearchParamsОбъект для управления параметрами запроса | { foo: 'bar', hello: 'world' } |
| hash | Часть якоря, включая# | "#section" |
| Метод | Описание | Пример кода | Пример вывода |
|---|---|---|---|
| get(name) | Получить значение параметра запроса с указанным именем | myUrl.searchParams.get("foo") | "bar" |
| append(name, value) | Добавить новый параметр в строку запроса | myUrl.searchParams.append("newKey", "newValue") | ?foo=bar&newKey=newValue |
| set(name, value) | Установить параметр с указанным именем в строке запроса (обновить, если он уже существует) | myUrl.searchParams.set("foo", "newBar") | ?foo=newBar |
| delete(name) | Удалить параметр запроса с указанным именем | myUrl.searchParams.delete("foo") | ?hello=world |
| has(name) | Определяет, существует ли параметр с указанным именем в строке запроса | myUrl.searchParams.has("foo") | trueилиfalse |
| forEach(callback) | Перебирает пары ключ-значение параметров запроса и выполняет функцию обратного вызова | myUrl.searchParams.forEach((v, k) => console.log(k, v)) | Вывод пар ключ-значение |
| toString() | Преобразует параметры запроса в строковую форму, подходящую для перестроения URL | myUrl.searchParams.toString() | "foo=bar&hello=world" |
Пример
console.log(myUrl.pathname); // Вывод: /path
console.log(myUrl.searchParams.get("foo")); // Вывод: bar
myUrl.searchParams.append("newKey", "newValue");
console.log(myUrl.href); // Вывод: http://example.com/path?foo=bar&hello=world&newKey=newValue
Получение содержимого POST-запроса
В Node.js обработка POST-запросов обычно требует получения данных из тела запроса через модуль http. В отличие от GET-запросов, данные POST-запроса не включаются в URL, а передаются как тело запроса. Поэтому при получении POST-данных в Node.js необходимо прослушивать и обрабатыватьrequestобъекта requestdataиendсобытие.
- Прослушивайте
dataсобытие: когда фрагмент данных поступает на сервер,dataСобытие срабатывает, и фрагмент данных передаётся в колбэк в качестве параметра. - Прослушивайте
endсобытие: когда всё тело запроса получено,endСобытие срабатывает, и на этом этапе вы можете обработать полные POST-данные.
Пример
// Создать HTTP-сервер
http.createServer((req, res) => {
// Проверить, является ли метод запроса POST
if (req.method === 'POST') {
let body = '';
// Прослушивать событие data, получать данные частями
req.on('data', (chunk) => {
body += chunk; // Накапливать полученные фрагменты данных
});
// Прослушивать событие end, приём данных завершён
req.on('end', () => {
// Вывести полученные POST-данные
console.log('Полученные POST-данные:', body);
// Установить заголовки и содержимое ответа
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('POST-данные успешно получены!');
});
} else {
// Обработка не-POST запросов
res.writeHead(405, { 'Content-Type': 'text/plain' });
res.end('Поддерживаются только POST-запросы.');
}
}).listen(3000, () => {
console.log('Сервер запущен по адресу http://localhost:3000');
});
Пояснение к коду:
- Определение метода запроса: Используйте
req.method === 'POST'чтобы определить, является ли тип запроса POST. - Получение данных: В
req.on('data')событии, накапливайте фрагменты данных, чтобы сформировать полное тело данных. - Завершение получения: В
req.on('end')событии, обработайте полные POST-данные. - Ответ клиенту: После завершения приёма и обработки данных отправьте ответ клиенту.
Вы можете использовать команду curl для тестирования POST-запросов:
curl -X POST -d "name=example&age=25" http://localhost:3000
Обработка JSON-данных
Если POST-запрос отправляет данные JSON, вы можетеreq.on('end')разобрать полученные данные в объект:
req.on('end', () => {
const parsedData = JSON.parse(body); // 将 JSON 字符串解析为对象
console.log('Received JSON data:', parsedData);
res.end('JSON data received successfully!');
});
Модуль querystring
Модуль querystring используется для обработки строк запроса URL и данных POST-запросов.
Для данных POST-запроса, закодированных как application/x-www-form-urlencoded, модуль querystring может помочь разобрать тело запроса и преобразовать его в объект JavaScript для удобного доступа и манипулирования.
Предположим, данные POST-запроса, отправленные клиентом, имеют форматapplication/x-www-form-urlencoded(например, отправка формы), и данные похожи наname=example&age=25После получения данных вы можете использоватьquerystring.parseметод для разбора данных в объект.
Объяснение базовой структуры синтаксиса
Следующая форма из примера отправляется методом POST и выводит данные:
Пример
GIF-демонстрация результата выполнения:
