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

task 1

Создайте сервер - localhost, 3002 порт. Все работы выполняются на основе шаблона. Сервер может принимать запросы GET и POST, на основании запроса - запускает функцию (см. задания ниже).

task 2

Добавьте в сервер код, который реализует следующее: если сервер принял GET запрос с параметром p равным 70, то сервер запускает функцию t2.

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

task 3

Добавьте в сервер код, который реализует следующее: если сервер принял GET запрос с параметром p равным 80, то сервер запускает функцию t3.

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

task 4
Материалы юнита доступны после покупки курса
task 5
Материалы юнита доступны после покупки курса
task 6
Материалы юнита доступны после покупки курса