Все началось с того, что передо мной встала задача написать бота для 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/
Добавить комментарий