Автор оригинала: Scott Robinson.
В наши дни наши веб-приложения имеют тенденцию иметь много интеграций с другими услугами, будь то взаимодействие с помощью службы отдыха, такими как Twitter, или загрузка изображений из Flickr. Использование узла/JavaScript – один из самых популярных языков для обработки таких приложений. В любом случае, вы будете делать много HTTP-запросов, что означает, что вам понадобится сплошной модуль, чтобы написать код гораздо более терпимым.
Запрос Модуль – это безусловно, самый популярный (нестандартный) узел узла для создания HTTP-запросов. На самом деле, это действительно просто обертка вокруг встроенного узла http Модуль, так что вы можете достичь всей такой же функциональности самостоятельно с http
, но Запрос
Просто делает его намного проще.
Делать HTTP-запросы
Пока есть довольно много вариантов для вас в Запрос
(Многие из которых мы покроем на протяжении всей этой статьи), также может быть довольно простым в использовании. Пример «Hello World» для этой библиотеки так же просто, как проходит URL и обратный вызов:
const request = require('request'); request('http://stackabuse.com', function(err, res, body) { console.log(body); });
Код выше отправляет запрос HTTP Get To Stackabuse.com, а затем печатает возвращенный HTML на экран. Этот тип запроса работает для любой конечной точки HTTP, возвращает ли он HTML, JSON, изображение или только что-либо еще.
Первый аргумент для Запрос
Может либо быть строкой URL или объектом опций. Вот некоторые из более распространенных вариантов, которые вы столкнулись с вами:
URL
: URL назначения HTTP-запросаМетод
: Метод HTTP для использования (Get, Post, Delete и т. Д.)Заголовки
: Объект заголовков HTTP (значение ключей), который должен быть установлен в запросеФорма
: Объект, содержащий данные формы значения ключа
const request = require('request'); const options = { url: 'https://www.reddit.com/r/funny.json', method: 'GET', headers: { 'Accept': 'application/json', 'Accept-Charset': 'utf-8', 'User-Agent': 'my-reddit-client' } }; request(options, function(err, res, body) { let json = JSON.parse(body); console.log(json); });
Используя Варианты
Объект, этот запрос использует метод Get для получения данных JSON непосредственно из Reddit, который возвращается в виде строки в Тело
поле. Отсюда вы можете использовать Json.parse
и используйте данные как обычный объект JavaScript.
Этот же формат запроса может быть использован для любого Тип HTTP-метода , будь то удалить, поставить, пост или варианты. Хотя, не все методы используются точно так же. Некоторые, как метод Post, может включать данные в запросе. Есть несколько способов, которыми эти данные могут быть отправлены, некоторые из которых являются:
Тело
: AБуфер
,Строка
илиПоток
Объект (может быть объектом, еслиJSON
опция установлено наTrue
)Форма
: Объект данных пары ключа (мы перейдем к этому позже)Многопарта: Массив объектов, которые могут содержать свои собственные заголовки и атрибуты тела
Каждый полностью удовлетворяет другую потребность (и еще больше способов отправлять данные, которые можно найти в этот раздел запроса README ). Запрос
Модуль содержит некоторые удобные методы, которые делают их немного проще работать, однако, так же, как будьте обязательно прочитайте полные документы, чтобы не затруднить свой код, чем он должен.
Говоря об хелперных методах, гораздо более краткая способ вызовов различных HTTP-методов – использовать соответствующие методы помощника. Вот несколько из более часто используемых:
request.get (Опции, обратный вызов)
request.post (варианты, обратный вызов)
request.head (варианты, обратный вызов)
request.delete (опции, обратный вызов)
Хотя это не сэкономит вам тонну строк кода, он, по крайней мере, облегчает ваш код немного проще понять, что позволив вам просто посмотреть на этот метод, который вызывается, и не облагается, чтобы проанализировать все различные варианты для поиска Это.
Формы
Независимо от того, включите ли вы с помощью API для отдыха или создавая бот, чтобы ползать и отправить данные на веб-сайты, в какой-то момент вам нужно будет отправлять данные для формы. Как всегда с Запрос
, это можно сделать несколько разных способов, в зависимости от ваших потребностей.
Для регулярных форм (URL-кодировщик, с помощью MIME Тип Приложение/X-www-form-urlencoded
), вы лучше всего, используя .post ()
Удобный метод с объектом формы:
let options = { url: 'http://http://mockbin.com/request', form: { email: '[email protected]', password: 'myPassword' } }; request.post(options, callback);
Это загрузит данные, такими же, как форма HTML, с единственным ограничением, что вы не можете загружать файлы таким образом. Для того, чтобы сделать это, вам нужно использовать formdata
опция вместо этого, которая использует Форма-данные Библиотека под.
Использование formdata
Вместо этого мы можем передавать файловые данные на сервер через Буфер
S, Поток
S или даже не файловые данные (как и раньше) с простыми парами клавишных пар.
let formData = { // Pass single file with a key profile_pic: fs.createReadStream(__dirname + '/me.jpg'), // Pass multiple files in an array attachments: [ fs.readFileSync(__dirname + '/cover-letter.docx'), // Buffer fs.createReadStream(__dirname + '/resume.docx'), // Stream ], // Pass extra meta-data with your files detailed_file: { value: fs.createReadStream(__dirname + '/my-special-file.txt'), options: { filename: 'data.json', contentType: 'application/json' } }, // Simple key-value pairs username: 'ScottWRobinson' }; request.post('http://http://mockbin.com/request', {formData: formData}, callback);
Это отправит ваши файлы с типом MIME Мультипартные/формы-данные
, который является многократной формой загрузки.
Хотя это будет более чем достаточно для большинства случаев использования пользователей, есть времена, когда вам нужен еще более тонкий контроль, например, Pre/Post CLRF (новые линии), Chunking, или указание собственных многократнов. Для получения дополнительной информации об этих дополнительных вариантах проверьте Этот раздел Запрос
Readme Отказ
Поток
Одна из самых используемых особенностей во многих языках программирования, на мой взгляд, являются ручьями. Их полезность распространяется за пределы только сетевых запросов, но это служит идеальным примером относительно того, почему вы должны их использовать. Для краткого описания о том, как и почему вы должны использовать их, посмотрите раздел «потоки» серверов узлов HTTP-серверов для статической заготовки файлов.
Короче говоря, используя потоки для больших объемов данных (например, файлов) могут помочь уменьшить след памяти вашего приложения и времени отклика. Чтобы сделать это легче использовать, каждый из Запрос
Методы могут труба
их вывод в другой поток.
В этом примере мы загружаем логотип Node.js, используя запрос на получение и поток его в локальный файл:
let fileStream = fs.createWriteStream('node.png'); request('https://nodejs.org/static/images/logos/nodejs-new-white-pantone.png').pipe(fileStream);
Как только HTTP-запрос начинает возвращать детали загруженного изображения, он будет «зарабатывать», чтобы данные непосредственно к файлу ‘Node.png’.
Загрузка файла, таким образом также имеет некоторые другие преимущества. Потоки отлично подходят для применения преобразований на данные, как это загружено. Так, например, скажем, вы загрузите большое количество конфиденциальных данных с Запрос
это необходимо немедленно зашифровать. Для этого вы можете применить преобразование шифрования трубопроводом выхода Запрос
к crypto.createCigher :
let url = 'http://example.com/super-sensitive-data.json'; let pwd = new Buffer('myPassword'); let aesTransform = crypto.createCipher('aes-256-cbc', pwd); let fileStream = fs.createWriteStream('encrypted.json'); request(url) .pipe(aesTransform) // Encrypts with aes256 .pipe(fileStream) // Write encrypted data to a file .on('finish', function() { console.log('Done downloading, encrypting, and saving!'); });
Легко просмотреть потоки, и многие люди делают, когда они пишут код, но они могут одновременно помочь вашему исполнению, особенно с библиотекой, такими как Запрос
Отказ
Разное. Конфигурации
Есть гораздо больше для HTTP-запросов, чем просто указывать URL-адрес и загружая данные. Для более крупных приложений и особенно тех, которые должны поддерживать более широкий спектр сред, ваши запросы могут потребоваться обработать довольно много параметров конфигурации, такие как прокси или специальные сертификаты SSL-доверительные.
Одно важное разное. Функция, чтобы указать, это request.defaults ()
Метод, который позволяет вам указывать параметры по умолчанию, чтобы вам не нужно давать им за каждый запрос.
let req = request.defaults({ headers: { 'x-access-token': '123abc', 'User-Agent': 'my-reddit-client' } }); req('http://your-api.com', function(err, res, body) { console.log(body); });
Теперь, в приведенном выше примере, все запросы сделаны с req
всегда будет заголовки X-Access-токен
и Пользовательский агент
набор. Это идеально подходит для настройки заголовков, таких как эти, прокси-серверы или конфигурации TLS/SSL.
На протяжении всей остальной части этого раздела мы посмотрим на некоторые более распространенные функции, которые вы столкнетесь:
Прокси
Если ваш компьютер находится за корпоративным прокси или вы хотите перенаправить свой трафик в другую страну, в какой-то момент вам может понадобиться указать адрес прокси. Самый простой способ достижения этого – использовать прокси
Опция, который принимает адрес, в котором трафик проксируется через:
let options = { url: 'https://www.google.com', proxy: 'http://myproxy.com' }; request(options, callback);
Варианты
Объект – это один из способов указать прокси, но Запрос
Также используются следующие переменные среды для настройки соединения прокси:
- Http_proxy/http_proxy.
- Https_proxy/https_proxy.
- No_proxy/no_proxy.
Это дает вам довольно больший контроль, как установка, какие сайты не должен быть закрепленным через No_proxy
Переменная.
TLS/SSL
Иногда API должен иметь некоторую дополнительную безопасность и поэтому требует клиентского сертификата. Это на самом деле довольно распространено с частными корпоративными API, поэтому стоит знать, как это сделать.
Другим возможным сценарием является то, что вы хотите, чтобы ваши HTTP-запросы явно доверяют определенным Власти сертификатов , что может включать сертификаты, которые вас подписаны вами или вашей компанией.
Как и со всеми другими конфигурациями, которые мы видели до сих пор, они устанавливаются в Варианты
объект:
const fs = require('fs'); const request = require('request'); let myCertFile = fs.readFileSync(__dirname + '/ssl/client.crt') let myKeyFile = fs.readFileSync(__dirname + '/ssl/client.key') let myCaFile = fs.readFileSync(__dirname + '/ssl/ca.cert.pem') var options = { url: 'https://mockbin.com/request', cert: myCertFile, key: myKeyFile, passphrase: 'myPassword', ca: myCaFile }; request.get(options);
Основная аутентификация
Сайты, которые используют Базовая аутентификация доступа все еще можно получить доступ с помощью auth
вариант:
const request = require('request'); var options = { url: 'https://mockbin.com/request', auth: { username: 'ScottWRobinson', password: 'myPassword' } }; request.get(options);
Эта опция устанавливает один из заголовков HTTP, как «Авторизация»: «Основной C2NVDHQ6CGFZC3DVCMQH»
Отказ «Базовая» строка в заголовке «Авторизация» заявляет, что это основной запрос AUTH AUTH и буквенно-цифровой строки, которая следует, представляет собой кодировку RFC2045 MIME (вариант base64) нашего имени пользователя и пароля.
Перенаправлять
Я обнаружил, что в некоторых приложениях, таких как Web Scraping, есть несколько случаев, когда вам нужно следовать перенаправленным, чтобы ваш запрос был успешным. Как вы, вероятно, догадались, есть возможность указать, следует ли следовать перенаправлению по умолчанию, но Запрос
Далее идет еще один шаг и позволит вам предоставить функцию, которую можно использовать для условно-определения, следует ли следовать перенаправлению.
Несколько вариантов перенаправления являются:
Следуйтеруются
: Еслиправда
Затем следуйте всем перенаправлению HTTP 3xx. Или отправитьФункция (RES) {}
это используется для определения того, следует ли следовать перенаправлениюПосетителендерные меры
: Следите за всеми безрезультатными перенаправлениями HTTP 3xxMaxedirects
Максимальное количество раз, чтобы следовать замкнутыми перенаправлениями (по умолчанию до 10)
Заключение
Без сомнения, Запрос
это мощный модуль, и вероятно, что вы будете использовать часто. Учитывая все его функции, которые он обеспечивает, она может выступать в качестве отличной отправной точки для чего-либо из веб-скамера к библиотеке клиента для вашего API.
Есть несколько дополнительных вариантов и конфигураций, которые можно использовать с Запрос
Чем мы здесь показали, поэтому обязательно проверьте Документация Больше подробностей. Имейте в виду, что не все в модуле документировано, поэтому вам может потребоваться сделать еще несколько поисков/экспериментов, чтобы найти ваш ответ.
Вы использовали запрос В любом из ваших проектов? Если так, как?