Статьи

Выполнение HTTP-запросов в Node.js

В предыдущих статьях я сосредоточился на создании сервера Node.js для обработки HTTP-запросов. Эта статья рассматривает проблему в обратном порядке, показывая вам, как делать HTTP-запросы из ваших приложений Node.js. Вы можете спросить себя, почему вы хотите это сделать. Сразу приходят на ум два приложения — просмотр веб-страниц и проксирование . Скребки — это части программного обеспечения, которые загружают веб-страницы и программно извлекают из них информацию. Прокси-серверы выступают в качестве посредников, перенаправляя клиентские запросы на другие серверы и возвращая ответы.

Модуль запроса

Самый простой способ создания HTTP-запросов в Node.js — использовать модуль request . Написанный Mikeal Rogers request позволяет вам выполнять все типы HTTP-запросов, включая GET , POST , PUT и DELETE . Его гибкость делает модуль request идеальным для взаимодействия с RESTful API . Вы можете установить request используя следующую команду npm .

 запрос установки npm

После того как вы установили request , создайте новый файл Node.js, содержащий код, показанный ниже. Первая строка примера используется для импорта request в программу. Сделать HTTP-запрос так же просто, как вызвать функцию request() . В этом примере мы делаем запрос на загрузку домашней страницы JSPro. Второй аргумент request() — это, конечно, функция обратного вызова.

 var request = require("request"); request("http://www.sitepoint.com", function(error, response, body) { console.log(body); }); 

Функция обратного вызова request() принимает три аргумента — error , response и body . Как следует из названия, error содержит информацию о любых проблемах, возникших во время HTTP-запроса. Аргументом response является объект, содержащий различные данные, возвращаемые при вызове, включая код состояния, заголовки и многое другое. Третий аргумент обратного вызова, body , является телом ответа. В предыдущем примере body содержало исходный код домашней страницы JSPro.

Модуль request также может быть объединен с модулем файловой системы для потоковой передачи HTTP-запросов к файлам и от них. В следующем примере снова выбирается JSPro. Однако вместо отображения исходного кода в консоли он записывается в файл с именем «jspro.htm».

 var request = require("request"); var fs = require("fs"); request("http://www.sitepoint.com").pipe(fs.createWriteStream("jspro.htm")); 

Параметризация запросов

Предыдущие примеры создавали простые запросы GET для URL. Однако мы можем изменить HTTP-запрос, передав объект конфигурации в качестве первого аргумента request() . В следующем примере используется более мощный синтаксис для повторной загрузки JSPro. Обратите внимание на многочисленные параметры конфигурации. Параметры uri и method указывают request на отправку запроса GET в JSPro.

 var request = require("request"); request({ uri: "http://www.sitepoint.com", method: "GET", timeout: 10000, followRedirect: true, maxRedirects: 10 }, function(error, response, body) { console.log(body); }); 

Параметр timeout указывает request на ожидание ответа в 10 000 миллисекунд (десять секунд) перед тем, как отказаться. Последние два параметра относятся к следующим перенаправлениям. Многие страницы выполняют перенаправления за кулисы без ведома пользователя. Параметры followRedirect и maxRedirects предписывают request выполнить до десяти перенаправлений HTTP 3 xx . Также обратите внимание, что request() поддерживает много других параметров, которые здесь не показаны.

Отправка данных формы

Как упоминалось ранее, request поддерживает не только запросы GET . Одной из наиболее распространенных операций является отправка данных формы с использованием запроса POST . В следующем примере используется параметр form request() для отправки имени пользователя как части POST . Затем страница PHP отвечает, приветствуя пользователя по имени.

 var request = require("request"); request({ uri: "http://www.cjihrig.com/development/php/hello_form.php", method: "POST", form: { name: "Bob" } }, function(error, response, body) { console.log(body); }); 

Работа с Cookies

Многие сайты отслеживают различные взаимодействия пользователей с помощью файлов cookie . Файлы cookie — это небольшие фрагменты данных, которые передаются между клиентом и сервером при каждой транзакции HTTP. Чтобы облегчить использование файлов cookie, request предоставляет методы jar() и cookie() . Отдельные куки создаются методом cookie() . В строке 3 следующего примера создается файл cookie, в котором указывается имя пользователя. Затем cookie-файл добавляется в jar-файл cookie, созданный в строке 2. Когда выполняется HTTP-запрос, параметр jar используется для отправки jar-файла cookie на сервер.

 var request = require("request"); var jar = request.jar(); var cookie = request.cookie("name=John"); jar.add(cookie); request({ uri: "http://www.cjihrig.com/development/php/hello_cookies.php", method: "GET", jar: jar }, function(error, response, body) { console.log(body); }); 

Когда ответ будет получен, пользователь будет приветствоваться как Джон, имя хранится в файле cookie. Баночка печенья также обновляется с любыми изменениями, внесенными сервером. Если вы распечатаете банку с cookie до и после запроса, вы увидите, что сервер изменил значение куки с "John" на "Stranger" . Один и тот же файл cookie может передаваться последовательным HTTP-запросам, чтобы имитировать взаимодействие реального пользователя с сайтом.

Вывод

В этой статье представлен простой, но мощный модуль request . Поскольку эта статья не является исчерпывающей, я рекомендую хотя бы просмотреть документацию, чтобы узнать, что еще может сделать request . Следите за новостями о предстоящей статье, которая более подробно расскажет о поиске в Интернете.

И если вам понравилось читать этот пост, вы полюбите Learnable ; место, чтобы узнать новые навыки и приемы у мастеров. Участники получают мгновенный доступ ко всем электронным книгам SitePoint и интерактивным онлайн-курсам, таким как Jump Start JavaScript .

Комментарии к этой статье закрыты. У вас есть вопрос о JavaScript? Почему бы не спросить об этом на наших форумах ?