Unit 8. Получение 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 — тоже выполнен!

Домашнее задание

Загрузка ДЗ на проверку возможна только после приобретения курса.

Task 1.

Создайте сервер - localhost, 3002 порт. Все работы выполняются на основе шаблона.

Task 2.

Напишите функцию t2 которая принимает внутри сервера два параметра request, response и если запрос GET и параметр p равен 70 возвращает 800

Task 3.

Напишите функцию t3 которая принимает внутри сервера два параметра request, response и если запрос GET и параметр p равен 80 возвращает 900;

Task 4.
Задача доступна после приобретения курса.
Task 5.
Задача доступна после приобретения курса.
Task 6.
Задача доступна после приобретения курса.

Следи за новостями курсов на нашем канале

Открыть

Правила оформления домашних заданий

Открыть

Форум по задачам

Forum