[Из песочницы] Легковесный модуль для HTTP запросов

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

Бот был написан. Я заметил, что потребление им памяти росло с каждым запросом к 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

© Habrahabr.ru