Легковесный модуль для HTTP запросов

от автора

Все началось с того, что передо мной встала задача написать бота для Telegram, здесь, я первый раз столкнулся с их API. Для работы с ним я выбрал популярный на сегодняшний день модуль Request.

Бот был написан. Я заметил, что потребление им памяти росло с каждым запросом к API, уличив в проблеме тяжеловесный Request, я решил попробовать написать свой модуль для HTTP запросов, максимально простой, легковесный и быстрый.
Когда все было готово я заметил, что потребление памяти ботом росло с каждым запросом к API, я грешил на тяжеловесный Request и решил попробовать написать свой модуль для HTTP запросов, максимально простой, легковесный, быстрый и без зависимостей.

В итоге вышел максимально компактный (сейчас в основном файле модуля меньше 200 строк) и не обделенный функционалом модуль, который я назвал tiny_request.

Простота использования

Для обычного GET запроса достаточно написать всего несколько строк:

var req = require('tiny_request')  req.get('http://google.com', function(body, response, err){     if (!err && response.statusCode == 200) {           console.log(body)      }  }) 

JSON

Так как в первую очередь модуль будет использоваться для работы с API я решил, что нужен простой механизм работы с json.
Для автоматической десериализации полученного ответа от сервера достаточно передать параметр json: true

var req = require('tiny_request')  req.get({ url: 'http://test.com/json', json: true}, function(body, response, err){     if (!err && response.statusCode == 200) {           console.log(body) //body now is parsed JSON object     }  }) 

GET запросы

Для запроса с GET параметрами достаточно передать query равный объекту с GET параметрами, также для изменения порта запроса достаточно передать параметр port:

req.get({ url: 'http://test.com', query: { test: 'test' }, pot: 8080}, function(body, response, err){     if (!err && response.statusCode == 200) {           console.log(body)      }  }) 

POST Multipart

Куда же без POST запросов и передачи файлов?

var data = {     image: {         value: fs.createReadStream('photo.png'),          filename: 'photo.png',         contentType: 'image/png'                 },     test: 'test' }  req.post({     url: 'http://test.com',     multipart: data  }, function(body, response, err){     if (!err && response.statusCode == 200) {           console.log(body)      }  }) 

POST формы

Работа с формами так же очень проста:

var form = {     test: 'test' }  req.post({ url: 'http://test.com', form: form}, function(body, response, err){     if (!err && response.statusCode == 200) {           console.log(body)      }  }) 

HTTP заголовки

Для добавления заголовков достаточно передать параметр headers:

var headers = {     'Test-Header': 'test' }  req.post({ url: 'http://test.com', headers: headers}, function(body, response, err){     if (!err && response.statusCode == 200) {           console.log(body)      }  }) 

Pipe stream

Работа со стримами тоже проста:

req.get({url: url, pipe: stream})  

Все исходники можно найти на GitHub: github.com/Naltox/tiny_request

ссылка на оригинал статьи http://habrahabr.ru/post/264583/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *