Kroz ovaj blog post pokazati ću kako napraviti jednostavan RESTful API koristeći Node.js i Express.js. Pomoću API-ja povezati ćemo se sa MySQL bazom, prikazati popis korisnika te urediti i brisati korisnike, a sve ćemo testirati pomoću Postmana.
Uz pretpostavku da imate instaliran Node.js možemo krenuti.
Postavljanje projekta
Kao i u prošlom blog postu, i ovdje prvo moramo postaviti projekt. Za početak ćemo kreirati mapu projekta koja će se zvati KorisniciAPI. Nakon toga unutar mape projekta pokrećemo naredbu $ npm init --yes kako bi dobili package.json
1 2 3 4 5 6 7 8 9 10 11 12 |
{ "name": "KorisniciAPI", "version": "1.0.0", "description": "Primjer izrade jednostavnog Node.js i Express.js RESTful API-ja", "main": "server.js", //inače bude index.js "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "Tomislav Stanković", "license": "MIT" } |
Kako bi ovaj API radio ono što smo zamislili moramo dodati nekoliko NPM paketa, a to su:
- Express.js: $ npm install express --save
- bodyParser: $ npm install body-parser -save
- MySQL: $ npm install mysql --save
Nakon instalacije primijetit ćete dvije stvari, a to su nova mapa node_modules i promjena unutar package.json.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
{ "name": "KorisniciAPI", "version": "1.0.0", "description": "Primjer izrade jednostavnog Node.js i Express.js RESTful API-ja", "main": "server.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "Tomislav Stanković", "license": "MIT", "dependencies": { "body-parser": "^1.15.2", "express": "^4.14.0", "mysql": "^2.12.0" } } |
Server.js
Sada znamo da će prilikom pokretanja Node.js tražiti server.js pa ga idemo napraviti.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
var express = require('express'); // poziva express iz node_modules var app = express(); // označava da naša aplikacija koristi express var mysql = require('mysql'); // poziva mysql iz node_modules var bodyParser = require('body-parser'); // poziva bodyParser iz node_modules // označava da app koristi bodyParser() kako bi mogao dobiti podatke iz POST zahtjeva app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); var port = process.env.PORT || 8080; // definira port na kojemu će API raditi // definiranje zadane (defaultne) rute za naš API var apiRoutes = express.Router(); // testiranje rute (GET http://localhost:8080/api) apiRoutes.get('/', function(req, res) { res.json({ message: 'API radi!' }); //ako je sve ispravno postavljeno kao odgovor ćemo dobiti ovu poruku }); // ostale GET, POST, PUT, DELETE biti će definirane ovdje // sve rute sadržavati će /api app.use('/api', apiRoutes); // pokretanje API-ja app.listen(port); console.log('API je pokrenut i koristi port:' + ' ' + port); |
Struktura projekta sada izgleda ovako i više se neće mijenjati, osim sadržaja unutar server.js:
1 2 3 4 5 6 7 |
| - KorisniciAPI/ | - node_modules/ | - body-parser/ | - express/ | - mysql/ | - server.js | - package.json |
API pokrećemo naredbom
1 |
$ node server.js |
Nakon što smo testirali naš API pomoću rute http://localhost:8080/api zaključujemo da je sve u redu i možemo krenuti dalje.
MySQL baza i korisnici
Sada ćemo napraviti MySQL bazu podataka naziva korisniciapi s poljima k_id, k_ime i k_prezime.
Kako bi našu MySQL bazu povezali sa server.js moramo dodati sljedeće:
1 2 3 4 5 6 |
var pool = mysql.createPool({ host: 'localhost', user: 'root', password: '', database: 'korisniciapi' }); |
Sada imamo sve što nam je potrebno kako bi mogli napraviti rute za dodavanje (POST), dohvaćanje (GET), uređivanje (PUT) i brisanje (DELETE) korisnika.
Middleware
Ako želimo da se nešto dogodi svaki put kada naš API dobije nekakav zahtjev onda koristimo middleware. Za potrebe ovog primjera stavit ćemo da nam console.log() poruku.
1 2 3 4 5 |
apiRoutes.use(function(req, res, next) { // provjera korisničkih podataka prilikom logirana/prijave console.log('Nešto se događa.'); next(); // idi na sljedeću rutu }); |
Kreiranje ruta
Krećemo s izradom ruta za naše korisnike.
Dodavanje korisnika
POST http://localhost:8080/api/dodajkorisnika
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
apiRoutes.post('/dodajkorisnika', function (req, res, next) { pool.getConnection(function(err, connection) { if (err) { console.error("Dogodila se greška: " + err); } var korisnik = { k_ime: req.body.ime, k_prezime: req.body.prezime }; connection.query('INSERT INTO korisnik SET ?', korisnik, function(err, rows) { if (err) { throw err; } else { res.json("Uspješno dodan korisnik!"); res.end(); } connection.release(); }); }); }) |
Dohvaćanje svih korisnika
GET http://localhost:8080/api/pregledkorisnika
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
apiRoutes.get('/pregledkorisnika', function(req, res,next){ pool.getConnection(function(err, connection) { if (err) { console.error("Dogodila se greška: " + err); } var query = "SELECT * FROM korisnik ORDER BY k_id ASC"; var table = ["korisniciapi"]; query = mysql.format(query,table); connection.query(query,function(err,rows){ connection.release(); if (err) { return next(err); } else { res.json({ success: true, popis_korisnika: rows }); } }); }); }); |
Uređivanje jednog korisnika
PUT http://localhost:8080/api/korisnik/:k_id
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
apiRoutes.put('/korisnik/:k_id', function(req, res, next){ pool.getConnection(function(err, connection) { if (err) { console.error("Dogodila se greška: " + err); } var korisnik = { k_ime: req.body.ime, k_prezime: req.body.prezime }; connection.query('update korisnik SET ? where k_id = ?', [korisnik, req.params.k_id], function(err, rows) { if (err) { return next(err); } else { res.writeHead(200, { "Content-Type": "application/json" }); var result = { success: true, detail: rows } res.write(JSON.stringify(result)); res.end(); } }); }); }); |
Brisanje jednog korisnika
DELETE http://localhost:8080/api/korisnik/:k_id
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
apiRoutes.delete('/korisnik/:k_id', function(req, res, next){ pool.getConnection(function(err, connection) { if (err) { console.error("Dogodila se greška: " + err); } connection.query('delete from korisnik where k_id = ?', [req.params.k_id], function(err, rows) { if (err) { return next(err); } else { res.writeHead(200, { "Content-Type": "application/json" }); var result = { success: true } res.write(JSON.stringify(result)); res.end(); } }); }); }); |
Zaključak
Ovo su osnove osnova kada je u pitanju izrada APi-ja. Nismo se dotaknuli pitanja sigurnosti, autentifikacije korisnika niti pokušali slati datoteke, npr. slike od korisnika, pomoću API-ja. Možda o tome bude riječi nekom drugom prilikom.
Naravno da kada budete radili kompleksniji sustav nećete sve rute staviti u server.js nego će svaka ruta imati svoju datoteku.
Posjetite GitHub i preuzmite projekt.
Poštovani,možda ovo nije tema ali bih vas molio kako napraviti svoj besplatni server kako bih dijelio IPTV kanale,bio bih vam zahvalan,unaprijed hvala sa poštovanjem Sanel Unkić.
Pozdrav,
šaljem primjer jednog sličnog rješenja https://quantizd.com/building-live-streaming-app-with-node-js-and-react/