SPRINT 08 . Получение GET и POST запросов на Node.js
Материалы
Текст
Получение параметров GET запроса в Node.js
Сегодня мы рассматриваем 2 кейса, которые несомненно будут вами использоваться при работе с Node.js. Это получение параметров POST и GET запросов в чистой Node.js (без фреймворков). Для того, чтобы посылать запросы мы используем программу POSTMAN — скачайте и установите ее на свой компьютер. Итак поехали. Шаг первый нам нужно создать сервер — мы уже это делали на начальных уроках, для этого подключаем модуль http, и используем метод
createServer: http.createServer((request, response) => {
}).listen(3000);
как видите серверу node.js мы в качестве параметра передаем функцию, которая принимает 2 параметра — request, response. Где request – это запрос, а response – ответ сервера, то есть то, что сервер отправит браузеру. Также в методе listen мы указываем номер порта который слушает сервер.
Добавим чуть кода, чтобы понять, что сервер сработал:
http.createServer((request, response) => {
console.log('server work');
response.end('work');
}).listen(3000);
Не забывайте сделать перезапуск node.js при изменении кода! Теперь если мы обновляем страницу, то браузер выводит work, а в консоли выводится server work.
Отлично! Параметр request сервера содержит много полезной информации о запросе. Кодировки, заголовки, параметры — все можно найти в нем. Нам буде полезно свойство request.method которое возвращает метод запроса, это или GET или POST. Поэтому мы можем добавить условие работы нашего кода в зависимости от метода.
Давайте в POSTMAN сделаем запрос на сервер node.js со следующими параметрами: http://localhost:3000?test=44 здесь мы через метод GET передаем queryString с ключом test и значением 44. Для того, чтобы отловить данный параметр в node.js напишем:
const http = require('http');
const url = require('url');
http.createServer((request, response) => {
console.log('server work');
if (request.method == 'GET') {
// GET -> получить обработать
let urlRequest = url.parse(request.url, true);
console.log(urlRequest.query.test); // ! GET Params
response.end(urlRequest.query.test);
}
}).listen(3000);
Так, с помощью модуля url ( подключаем в заголовке) мы получаем объект queryString в виде массива
urlRequest = url.parse(request.url, true);
И теперь, можем работать с параметрами. Давайте усложним задачу — пусть сервер в зависимости от четного или не четного числа отвечает odd или even.
const http = require('http');
const url = require('url');
http.createServer((request, response) => {
console.log('server work');
if (request.method == 'GET') {
// GET -> получить обработать
let urlRequest = url.parse(request.url, true);
console.log(urlRequest.query.test); // ! GET Params
if (urlRequest.query.test % 2 == 0) {
response.end('even');
}
response.end('odd');
}
}).listen(3000);
Теперь если мы изменяем значение test в параметре запроса то получаем на выходе odd или even в браузере. Кейс получения GET параметров в node.js – успешно пройден!!!
Получаем POST параметры в node.js
Итак, кейс номер два, и мы усложняем задачу — получаем POST тело запроса в чистой node.js. Даже прочитав рекомендации в документации вы можете не понять почему код такой сложной. Давайте объясню:
let body = '';
request.on('data', chunk => {
body += chunk.toString();
});
request.on('end', () => {
console.log(body);
let params = parse(body);
console.log(params);
console.log(params.hi);
response.end('ok');
});
body – строка куда мы будем накапливать запрос. Мы добавляем событие — on при поступлении данных запроса, а они будут читаться частями, в этом и есть большое отличие от GET, мы формируем body запроса. Вычитка частями ( chunk) позволяет читать большие объемы данных не создавая нагрузки на сервер. После окончания запроса — срабатывает end и мы получаем body – строку. С помощью метода parse – а мы для этого подключаем его в модулях в начале файла, преобразовываем строку в массив и работаем с ним. И полный код:
const http = require('http');
const url = require('url');
const { parse } = require('querystring');
http.createServer((request, response) => {
console.log('server work');
if (request.method == 'GET') {
// GET -> получить обработать
console.log(request.method); // !!!!
let urlRequest = url.parse(request.url, true);
// console.log(urlRequest);
console.log(urlRequest.query.test); // ! GET Params
if (urlRequest.query.test % 2 == 0) {
response.end('even');
}
response.end('odd');
}
else {
// POST
let body = '';
request.on('data', chunk => {
body += chunk.toString();
});
request.on('end', () => {
console.log(body);
let params = parse(body);
console.log(params);
console.log(params.hi);
response.end('ok');
});
}
}).listen(3000);
Итак, кейс по получению параметров POST запроса на нативной node.js — тоже выполнен!
TASKS
Создайте сервер - localhost, 3002 порт. Все работы выполняются на основе шаблона. Сервер может принимать запросы GET и POST, на основании запроса - запускает функцию (см. задания ниже).
Добавьте в сервер код, который реализует следующее: если сервер принял GET запрос с параметром p равным 70, то сервер запускает функцию t2.
Напишите функцию t2 которая получает от сервера два параметра request, response и возвращает строку '800'.
Добавьте в сервер код, который реализует следующее: если сервер принял GET запрос с параметром p равным 80, то сервер запускает функцию t3.
Напишите функцию t3 которая получает от сервера два параметра request, response и возвращает строку '900'.