Розробка REST API на Express, Restify, hapi і LoopBack

      Якщо ви працюєте над Node.js додатком, то є всі шанси, що у нього з'явиться якесь API, яке буде використано вами або кимось іншим. Напевно це буде REST API і перед вами постане дилема — які інструменти та підходи використовувати. Адже вибір так широкий…
 
 image
 
Завдяки неймовірно активному співтовариству Node.js, кількість результатів на NPM за запитом «rest» зашкалює. У кожного є свої реалізації та підходи, але у деяких є щось спільне у створенні REST API на Node.js.
 
 
 
 

Express

Найбільш поширений підхід — дати доступ до ресурсів за допомогою Express. Це дасть легкий старт, але в наслідку буде ставати все більш важким.
 
 Приклад Використовуючи Router останній версії Express 4.x, ресурс буде виглядати приблизно так:
 
 
var express = require('express');
var Item = require('models').Item;
var app = express();
var itemRoute = express.Router();
 
itemRoute.param('itemId', function(req, res, next, id) {
  Item.findById(req.params.itemId, function(err, item) {
    req.item = item;
    next();
  });
});
 
itemRoute.route('/:itemId')
  .get(function(req, res, next) {
    res.json(req.item);
  })
  .put(function(req, res, next) {
    req.item.set(req.body);
    req.item.save(function(err, item) {
      res.json(item);
    });
  })
  .post(function(req, res, next) {
    var item = new Item(req.body);
    item.save(function(err, item) {
      res.json(item);
    });
  })
  .delete(function(req, res, next) {
    req.item.remove(function(err) {
      res.json({});
    });
  })
  ;
 
app.use('/api/items', itemRoute);
app.listen(8080);

 
          
Плюси Мінуси
     
  1. Низький поріг входження, Express — це практично стандарт Node.js-додатки.
  2.  
  3. Повна кастомизация.

  4.  
  
     
  1. Всі ресурси необхідно створювати вручну і, в результаті, з'явиться багато повторного коду або гірше — власна бібліотека.
  2.  
  3. Кожен ресурс вимагає тестування або простий перевірки на п'ятисотий помилку.

  4.  
  5. Рефакторинг стане болючим, так як буде необхідно правити всі і скрізь.
  6.  
  7. Нету стандартного підходу, потрібно шукати свій.
  8.  
  
Express — це відмінний старт, але в підсумку ви відчуєте біль від «свого власного» підходу.
 
 
 

Restify

Restify — відносно старий гравець на полі Node.js API, але дуже стабільний і активно розробляється. Він створений для побудови правильних REST-сервісів і навмисно схожий на Express.
 
 Приклад Так як він схожий на Express, то і синтаксис практично такий же:
 
 
var restify = require('restify');
var Item = require('models').Item;
var app = restify.createServer()
 
app.use(function(req, res, next) {
  if (req.params.itemId) {
    Item.findById(req.params.itemId, function(err, item) {
      req.item = item;
      next();
    });
  }
  else {
    next();
  }
});
 
app.get('/api/items/:itemId', function(req, res, next) {
  res.send(200, req.item);
});
 
app.put('/api/items/:itemId', function(req, res, next) {
  req.item.set(req.body);
  req.item.save(function(err, item) {
    res.send(204, item);
  });
});
 
app.post('/api/items/:itemId', function(req, res, next) {
  var item = new Item(req.body);
  item.save(function(err, item) {
    res.send(201, item);
  });
});
 
app.delete('/api/items/:itemId', function(req, res, next) {
  req.item.remove(function(err) {
    res.send(204, {});
  });
});
 
app.listen(8080);

 
          
Плюси Мінуси
     
  1. Підтримка DTrace, якщо API працює на платформі, яка його підтримує.
  2.  
  3. Немає такого зайвого функціоналу, як шаблони і рендеринг.

  4.  
  5. Обмеження частоти запитів (throttling).
  6.  
  7. Підтримка SPDY
  8.  
  
Мінуси такі ж як і у Express — багато зайвої роботи.
  
 
 
 

hapi

hapi — менш відомий фреймворк, який розробляється командою Walmart Labs. На відміну від Express і Restify у нього дещо інший підхід, що надає більший функціонал відразу з коробки.
 
 Приклад
var Hapi = require('hapi');
var Item = require('models').Item;
var server = Hapi.createServer('0.0.0.0', 8080);
 
server.ext('onPreHandler', function(req, next) {
  if (req.params.itemId) {
    Item.findById(req.params.itemId, function(err, item) {
      req.item = item;
      next();
    });
  }
  else {
    next();
  }
});
 
server.route([
  {
    path: '/api/items/{itemId}',
    method: 'GET',
    config: {
      handler: function(req, reply) {
        reply(req.item);
      }
    }
  },
  {
    path: '/api/items',
    method: 'PUT',
    config: {
      handler: function(req, reply) {
        req.item.set(req.body);
        req.item.save(function(err, item) {
          res.send(204, item);
        });
      }
    }
  },
  {
    path: '/api/items',
    method: 'POST',
    config: {
      handler: function(req, reply) {
        var item = new Item(req.body);
        item.save(function(err, item) {
          res.send(201, item);
        });
      }
    }
  },
  {
    path: '/api/items/{itemId}',
    method: 'DELETE',
    config: {
      handler: function(req, reply) {
        req.item.remove(function(err) {
          res.send(204, {});
        });
      }
    }
  }
]);
 
server.start();

 
          
Плюси Мінуси
     
  1. Повний контроль над прийомом запитів.
  2.  
  3. Детальна довідка з генерацією документації.

  4.  
  
hapi, також як Express і Restify, дає відмінні можливості, але як їх використовувати, ви повинні зрозуміти самі.
  
Express, Restify і hapi відмінні рішення для старту, але, якщо ви плануєте розвивати API, то вони можуть стати поганим вибором.
 
 


LoopBack

LoopBack від StrongLoop — це повноцінний Node.js-фреймворк для з'єднання додатків з даними через REST API. Він переймає мантру " домовленість в конфігурації ", що стала популярною в Ruby on Rails.
 
 
Приклад
 
var loopback = require('loopback');
var Item = require('./models').Item;
var app = module.exports = loopback();
 
app.model(Item);
app.use('/api', loopback.rest());
app.listen(8080);

Багато чарівництва відбувається за лаштунками, але всього шість рядків коду створять для вас ці ресурси:
 
GET /items
GET /items/count
GET /items/findOne
GET /items/{id}
GET /items/{id}/exists
POST /items
PUT /items
PUT /items/{id}
DELETE /items/{id}

 image
 
Щоб легко вивчити свій API, достатньо підключити вбудований модуль explorer :
 
var explorer = require('loopback-explorer');
app.use('/explorer', explorer(app, {basePath: '/api'}));

 
Тепер відкрийте localhost : 8080/explorer і отримаєте цю круту документацію:
 image
 
Приклад на LoopBack досить простий, але що на рахунок RPC-ресурсу?
 
var loopback = require('loopback');
var explorer = require('loopback-explorer');
var remoting = require('strong-remoting');
var Item = require('./models').Item;
var app = module.exports = loopback();
var rpc = remoting.create();
 
function echo(ping, callback) {
  callback(null, ping);
}
 
echo.shared = true;
echo.accepts = {arg: 'ping'};
echo.returns = {arg: 'echo'};
 
rpc.exports.system = {
  echo: echo
};
 
app.model(Item);
app.use('/api', loopback.rest());
app.use('/explorer', explorer(app, {basePath: '/api'}));
app.use('/rpc', rpc.handler('rest'));
app.listen(8080);

 
Тепер можна робити так:
 
$ curl "http://localhost:8080/rpc/system/echo?ping=hello"
{
  "echo": "hello"
}

 
 image
 
          
Плюси Мінуси
     
  1. Дуже швидка розробка REST API.
  2.  
  3. Домовленість в конфігурації.

  4.  
  5. Вбудовані готові моделі.
  6.  
  7. Підтримка RPC.
  8.  
  9. Повністю настроюється.
  10.  
  11. Обширна документація.
  12.  
  13. Команда, що працює над проектом на постійній основі і є основною компанією-контрибутором в Node.js.
  14.  
  15. Комерційна підтримка.
  16.  
  
Поріг входження трохи високий, так як фреймворк складається з безлічі деталей.
  
 
 
 

Що далі

 

  
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.