рдПрдХреНрд╕рдкреНрд░реЗрд╕, рдкреБрдирд░реНрд╕реНрдерд╛рдкрдирд╛, hapi рдФрд░ рд▓реВрдкрдмреИрдХ рдкрд░ REST рдПрдкреАрдЖрдИ рд╡рд┐рдХрд╛рд╕

рдпрджрд┐ рдЖрдк рдПрдХ Node.js рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЗрд╕ рдмрд╛рдд рдХреА рдкреВрд░реА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА API рд╣реЛрдЧреА рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдкрдХреЗ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╡реНрдпрдХреНрддрд┐ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рдПрдХ REST API рд╣реЛрдЧрд╛ рдФрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рджреБрд╡рд┐рдзрд╛ рд╣реЛрдЧреА - рдХреМрди рд╕реЗ рдЙрдкрдХрд░рдг рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреГрд╖реНрдЯрд┐рдХреЛрдгред рдЖрдЦрд┐рд░рдХрд╛рд░, рдЪреБрдирд╛рд╡ рдЗрддрдирд╛ рд╡реНрдпрд╛рдкрдХ рд╣реИ ...



рдЫрд╡рд┐



рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рд╕рдХреНрд░рд┐рдп Node.js рд╕рдореБрджрд╛рдп рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, "рдЖрд░рд╛рдо" рдХреЗ рд▓рд┐рдП рдПрдирдкреАрдПрдо рдкрд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рднрд╛рд░реА рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдореЗрдВ Node.js. рдкрд░ REST API рдмрдирд╛рдиреЗ рдореЗрдВ рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ







рдПрдХреНрд╕рдкреНрд░реЗрд╕



рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд╕рдВрд╕рд╛рдзрдиреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рджреЗрдирд╛ рд╕рдмрд╕реЗ рдЖрдо рддрд░реАрдХрд╛ рд╣реИред рдпрд╣ рдПрдХ рдЖрд╕рд╛рди рд╢реБрд░реБрдЖрдд рджреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реЛ рдЬрд╛рдПрдЧрд╛ред



рдЙрджрд╛рд╣рд░рдг
рдПрдХреНрд╕рдкреНрд░реЗрд╕ 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. рдХрдо рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд╕реАрдорд╛, рдПрдХреНрд╕рдкреНрд░реЗрд╕ рд▓рдЧрднрдЧ рдиреЛрдбреНрд╕ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рд╣реИред
  2. рдкреВрд░реНрдг рдЕрдиреБрдХреВрд▓рдиред


  1. рд╕рднреА рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдмрд╣реБрдд рдмрд╛рд░ рджреЛрд╣рд░рд╛рдпрд╛ рдЧрдпрд╛ рдХреЛрдб рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛, рдпрд╛ рдЗрд╕рд╕реЗ рднреА рдмрджрддрд░ - рдЖрдкрдХрд╛ рдЕрдкрдирд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдпред
  2. рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрд╕рд╛рдзрди рдХреЛ 500 рд╡реАрдВ рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдпрд╛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЬрд╛рдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
  3. рд░рд┐рдлреИрдХреНрдЯрд┐рдВрдЧ рджрд░реНрджрдирд╛рдХ рд╣реЛ рдЬрд╛рдПрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╣рд░ рдЬрдЧрд╣ рдФрд░ рд╣рд░ рдЬрдЧрд╣ рд╢рд╛рд╕рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ред
  4. рдХреЛрдИ рдорд╛рдирдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдирд╣реАрдВ рд╣реИ, рдЖрдкрдХреЛ рдЕрдкрдиреА рдЦреБрдж рдХреА рддрд▓рд╛рд╢ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдПрдХ рд╢рд╛рдирджрд╛рд░ рд╢реБрд░реБрдЖрдд рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдВрдд рдореЗрдВ рдЖрдк "рдЕрдкрдиреЗ рдЦреБрдж рдХреЗ" рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рджрд░реНрдж рдХреЛ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВрдЧреЗред





Restify



Restify Node.js рдПрдкреАрдЖрдИ рдХреНрд╖реЗрддреНрд░ рдкрд░ рдПрдХ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдкреБрд░рд╛рдирд╛ рдЦрд┐рд▓рд╛рдбрд╝реА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рд╕реНрдерд┐рд░ рдФрд░ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рд╣реИред рдпрд╣ рд╕рд╣реА REST рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдпрд╣ рдЬрд╛рдирдмреВрдЭрдХрд░ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдХреЗ рд╕рдорд╛рди рд╣реИред



рдЙрджрд╛рд╣рд░рдг
рдЪреВрдВрдХрд┐ рдпрд╣ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд╕рд┐рдВрдЯреИрдХреНрд╕ рд▓рдЧрднрдЧ рд╕рдорд╛рди рд╣реИ:



 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. SPDY рд╕рдорд░реНрдерди


рд╡рд┐рдкрдХреНрд╖ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдХреЗ рд╕рдорд╛рди рд╣реИрдВ - рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рдоред







HAPI



рд╣рдкреНрдкреА рд╡реЙрд▓рдорд╛рд░реНрдЯ рд▓реИрдмреНрд╕ рдЯреАрдо рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рдПрдХ рдХрдо-рдЬреНрдЮрд╛рдд рдврд╛рдВрдЪрд╛ рд╣реИред рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдФрд░ рд░рд┐рд╕реНрдЯреЛрд░ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЗрд╕рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ, рдЬреЛ рдмреЙрдХреНрд╕ рдХреЗ рдареАрдХ рдмрд╛рд╣рд░ рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред



рдЙрджрд╛рд╣рд░рдг
 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. рдкреНрд░рд▓реЗрдЦрди рдХреА рдкреАрдврд╝реА рдХреЗ рд╕рд╛рде рд╡рд┐рд╕реНрддреГрдд рдорджрджред


рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдФрд░ рд░рд┐рд╕реНрдЯрд┐рдлрд╛рдИ рдХреА рддрд░рд╣ рд╣реИрдкреА, рд╢рд╛рдирджрд╛рд░ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИред



рдПрдХреНрд╕рдкреНрд░реЗрд╕, рд░рд┐рд╕реНрдЯреЛрд░, рдФрд░ рд╣рдкреНрдкреА рдорд╣рд╛рди рд╕реНрдЯрд╛рд░реНрдЯ-рдЕрдк рд╕рдорд╛рдзрд╛рди рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдПрдХ рдПрдкреАрдЖрдИ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╡реЗ рдЦрд░рд╛рдм рд╡рд┐рдХрд▓реНрдк рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред





рд▓реВрдкрдмреИрдХ



рд╕реНрдЯреНрд░реЙрдиреНрдЧреНрд▓реВрдк рд▓реВрдкрдмреИрдХ рд░реАрд╕реНрдЯ рдПрдкреАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдбреЗрдЯрд╛ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрдг- рд╕рдВрдЪрд╛рд▓рд┐рдд Node.js рдлреНрд░реЗрдорд╡рд░реНрдХ рд╣реИред рдпрд╣ " рд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд╛ " рдордВрддреНрд░ рдХреЛ рдЕрдкрдирд╛рддрд╛ рд╣реИ, рдЬреЛ рд░реВрдмреА рдСрди рд░реЗрд▓реНрд╕ рдореЗрдВ рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реЛ рдЧрдпрд╛ рд╣реИред



рдЙрджрд╛рд╣рд░рдг


 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}
      
      





рдЫрд╡рд┐



рдЕрдкрдиреЗ API рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ:

 var explorer = require('loopback-explorer'); app.use('/explorer', explorer(app, {basePath: '/api'}));
      
      







рдЕрдм рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ рдХреЛ рдЦреЛрд▓реЗрдВ : 8080 / рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░

рдЫрд╡рд┐



рд▓реВрдкрдмреИрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрд░рдкреАрд╕реА рд╕рдВрд╕рд╛рдзрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?

 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" }
      
      







рдЫрд╡рд┐



рдЖрдХрд░реНрд╖рдг рдЖрддреЗ рд╣реИрдВ рд╡рд┐рдкрдХреНрд╖
  1. рдмрд╣реБрдд рддреЗрдЬреА рд╕реЗ REST рдПрдкреАрдЖрдИ рд╡рд┐рдХрд╛рд╕ред
  2. рд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд╛ред
  3. рдмрд┐рд▓реНрдЯ-рдЗрди рддреИрдпрд╛рд░ рдореЙрдбрд▓ред
  4. рдЖрд░рдкреАрд╕реА рд╕рдкреЛрд░реНрдЯред
  5. рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдХреВрд▓рдиред
  6. рд╡реНрдпрд╛рдкрдХ рдкреНрд░рд▓реЗрдЦрдиред
  7. рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реА рдЯреАрдо рдФрд░ Node.js. рдореЗрдВ рдореБрдЦреНрдп рдпреЛрдЧрджрд╛рди рджреЗрдиреЗ рд╡рд╛рд▓реА рдХрдВрдкрдиреА рд╣реИ
  8. рд╡рд╛рдгрд┐рдЬреНрдпрд┐рдХ рд╕рдорд░реНрдердиред


рдкреНрд░рд╡реЗрд╢ рд╕реАрдорд╛ рдереЛрдбрд╝реА рдЕрдзрд┐рдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд░реВрдкрд░реЗрдЦрд╛ рдореЗрдВ рдХрдИ рд╡рд┐рд╡рд░рдг рд╣реЛрддреЗ рд╣реИрдВред







рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реИ






All Articles