ExpressJS - RESTFul API
API selalu dibutuhkan untuk membuat aplikasi seluler, aplikasi satu halaman, menggunakan panggilan AJAX, dan memberikan data kepada klien. Gaya arsitektur populer tentang cara menyusun dan menamai API ini dan titik akhir disebutREST(Representational Transfer State). HTTP 1.1dirancang dengan mengingat prinsip REST. REST diperkenalkan olehRoy Fielding pada tahun 2000 dalam Paper Fielding Dissertations.
URI dan metode RESTful memberi kami hampir semua informasi yang kami butuhkan untuk memproses permintaan. Tabel yang diberikan di bawah ini merangkum bagaimana berbagai kata kerja harus digunakan dan bagaimana URI harus diberi nama. Kami akan membuat API film menjelang akhir; sekarang mari kita bahas bagaimana itu akan disusun.
metode | URI | Detail | Fungsi |
---|---|---|---|
DAPATKAN | / film | Aman, dapat disimpan dalam cache | Mendapatkan daftar semua film dan detailnya |
DAPATKAN | / film / 1234 | Aman, dapat disimpan dalam cache | Mendapat detail Film id 1234 |
POS | / film | T / A | Membuat film baru dengan detail yang diberikan. Respons berisi URI untuk sumber daya yang baru dibuat ini. |
TARUH | / film / 1234 | Idempoten | Mengubah id film 1234 (membuatnya jika belum ada). Respons berisi URI untuk sumber daya yang baru dibuat ini. |
MENGHAPUS | / film / 1234 | Idempoten | Id film 1234 harus dihapus, jika ada. Tanggapan harus berisi status permintaan. |
HAPUS atau PUT | / film | Tidak valid | Seharusnya tidak valid. DELETE dan PUT harus menentukan resource mana yang mereka kerjakan. |
Mari kita sekarang membuat API ini di Express. Kami akan menggunakan JSON sebagai format data transportasi kami karena mudah digunakan dalam JavaScript dan memiliki manfaat lain. Ganti fileindex.js file dengan movies.js file seperti pada program berikut.
index.js
var express = require('express');
var bodyParser = require('body-parser');
var multer = require('multer');
var upload = multer();
var app = express();
app.use(cookieParser());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(upload.array());
//Require the Router we defined in movies.js
var movies = require('./movies.js');
//Use the Router on the sub route /movies
app.use('/movies', movies);
app.listen(3000);
Sekarang setelah kita menyiapkan aplikasi, mari kita berkonsentrasi pada pembuatan API.
Mulailah dengan mengatur file movies.js. Kami tidak menggunakan database untuk menyimpan film tetapi menyimpannya di memori; jadi setiap kali server dimulai ulang, film yang ditambahkan oleh kami akan hilang. Ini dapat dengan mudah ditiru menggunakan database atau file (menggunakan modul fs node).
Setelah Anda mengimpor Express, buat Router dan ekspor menggunakan module.exports -
var express = require('express');
var router = express.Router();
var movies = [
{id: 101, name: "Fight Club", year: 1999, rating: 8.1},
{id: 102, name: "Inception", year: 2010, rating: 8.7},
{id: 103, name: "The Dark Knight", year: 2008, rating: 9},
{id: 104, name: "12 Angry Men", year: 1957, rating: 8.9}
];
//Routes will go here
module.exports = router;
DAPATKAN rute
Mari kita tentukan rute GET untuk mendapatkan semua film -
router.get('/', function(req, res){
res.json(movies);
});
Untuk menguji apakah ini berfungsi dengan baik, jalankan aplikasi Anda, lalu buka terminal Anda dan masukkan -
curl -i -H "Accept: application/json" -H "Content-Type: application/json" -X GET
localhost:3000/movies
Tanggapan berikut akan ditampilkan -
[{"id":101,"name":"Fight Club","year":1999,"rating":8.1},
{"id":102,"name":"Inception","year":2010,"rating":8.7},
{"id":103,"name":"The Dark Knight","year":2008,"rating":9},
{"id":104,"name":"12 Angry Men","year":1957,"rating":8.9}]
Kami memiliki rute untuk mendapatkan semua film. Sekarang mari kita buat rute untuk mendapatkan film tertentu berdasarkan id-nya.
router.get('/:id([0-9]{3,})', function(req, res){
var currMovie = movies.filter(function(movie){
if(movie.id == req.params.id){
return true;
}
});
if(currMovie.length == 1){
res.json(currMovie[0])
} else {
res.status(404);//Set status to 404 as movie was not found
res.json({message: "Not Found"});
}
});
Ini akan memberi kita film sesuai dengan id yang kita berikan. Untuk memeriksa output, gunakan perintah berikut di terminal Anda -
curl -i -H "Accept: application/json" -H "Content-Type: application/json" -X GET
localhost:3000/movies/101
Anda akan mendapatkan tanggapan berikut -
{"id":101,"name":"Fight Club","year":1999,"rating":8.1}
Jika Anda mengunjungi rute yang tidak valid, itu akan menghasilkan cannot GET error sedangkan jika Anda mengunjungi rute yang valid dengan id yang tidak ada, itu akan menghasilkan kesalahan 404.
Kita selesai dengan rute GET, mari kita lanjutkan ke POST rute.
Rute POST
Gunakan rute berikut untuk menangani POSTed data -
router.post('/', function(req, res){
//Check if all fields are provided and are valid:
if(!req.body.name ||
!req.body.year.toString().match(/^[0-9]{4}$/g) ||
!req.body.rating.toString().match(/^[0-9]\.[0-9]$/g)){
res.status(400);
res.json({message: "Bad Request"});
} else {
var newId = movies[movies.length-1].id+1;
movies.push({
id: newId,
name: req.body.name,
year: req.body.year,
rating: req.body.rating
});
res.json({message: "New movie created.", location: "/movies/" + newId});
}
});
Ini akan membuat film baru dan menyimpannya di variabel film. Untuk memeriksa rute ini, masukkan kode berikut di terminal Anda -
curl -X POST --data "name = Toy%20story&year = 1995&rating = 8.5" http://localhost:3000/movies
Tanggapan berikut akan ditampilkan -
{"message":"New movie created.","location":"/movies/105"}
Untuk menguji apakah ini telah ditambahkan ke objek film, Jalankan permintaan get untuk /movies/105lagi. Tanggapan berikut akan ditampilkan -
{"id":105,"name":"Toy story","year":"1995","rating":"8.5"}
Mari kita lanjutkan untuk membuat rute PUT dan DELETE.
Rute PUT
Rute PUT hampir sama dengan rute POST. Kami akan menentukan id untuk objek yang akan diperbarui / dibuat. Buat rute dengan cara berikut.
router.put('/:id', function(req, res){
//Check if all fields are provided and are valid:
if(!req.body.name ||
!req.body.year.toString().match(/^[0-9]{4}$/g) ||
!req.body.rating.toString().match(/^[0-9]\.[0-9]$/g) ||
!req.params.id.toString().match(/^[0-9]{3,}$/g)){
res.status(400);
res.json({message: "Bad Request"});
} else {
//Gets us the index of movie with given id.
var updateIndex = movies.map(function(movie){
return movie.id;
}).indexOf(parseInt(req.params.id));
if(updateIndex === -1){
//Movie not found, create new
movies.push({
id: req.params.id,
name: req.body.name,
year: req.body.year,
rating: req.body.rating
});
res.json({message: "New movie created.", location: "/movies/" + req.params.id});
} else {
//Update existing movie
movies[updateIndex] = {
id: req.params.id,
name: req.body.name,
year: req.body.year,
rating: req.body.rating
};
res.json({message: "Movie id " + req.params.id + " updated.",
location: "/movies/" + req.params.id});
}
}
});
Rute ini akan menjalankan fungsi yang ditentukan dalam tabel di atas. Ini akan memperbarui objek dengan detail baru jika ada. Jika tidak ada, itu akan membuat objek baru. Untuk memeriksa rute, gunakan perintah curl berikut. Ini akan memperbarui film yang ada. Untuk membuat Film baru, cukup ubah id menjadi id yang tidak ada.
curl -X PUT --data "name = Toy%20story&year = 1995&rating = 8.5"
http://localhost:3000/movies/101
Response
{"message":"Movie id 101 updated.","location":"/movies/101"}
HAPUS rute
Gunakan kode berikut untuk membuat rute penghapusan. -
router.delete('/:id', function(req, res){
var removeIndex = movies.map(function(movie){
return movie.id;
}).indexOf(req.params.id); //Gets us the index of movie with given id.
if(removeIndex === -1){
res.json({message: "Not found"});
} else {
movies.splice(removeIndex, 1);
res.send({message: "Movie id " + req.params.id + " removed."});
}
});
Periksa rute dengan cara yang sama seperti kami memeriksa rute lainnya. Jika penghapusan berhasil (misalnya id 105), Anda akan mendapatkan output berikut -
{message: "Movie id 105 removed."}
Akhirnya, kami movies.js File akan terlihat seperti berikut.
var express = require('express');
var router = express.Router();
var movies = [
{id: 101, name: "Fight Club", year: 1999, rating: 8.1},
{id: 102, name: "Inception", year: 2010, rating: 8.7},
{id: 103, name: "The Dark Knight", year: 2008, rating: 9},
{id: 104, name: "12 Angry Men", year: 1957, rating: 8.9}
];
router.get('/:id([0-9]{3,})', function(req, res){
var currMovie = movies.filter(function(movie){
if(movie.id == req.params.id){
return true;
}
});
if(currMovie.length == 1){
res.json(currMovie[0])
} else {
res.status(404); //Set status to 404 as movie was not found
res.json({message: "Not Found"});
}
});
router.post('/', function(req, res){
//Check if all fields are provided and are valid:
if(!req.body.name ||
!req.body.year.toString().match(/^[0-9]{4}$/g) ||
!req.body.rating.toString().match(/^[0-9]\.[0-9]$/g)){
res.status(400);
res.json({message: "Bad Request"});
} else {
var newId = movies[movies.length-1].id+1;
movies.push({
id: newId,
name: req.body.name,
year: req.body.year,
rating: req.body.rating
});
res.json({message: "New movie created.", location: "/movies/" + newId});
}
});
router.put('/:id', function(req, res) {
//Check if all fields are provided and are valid:
if(!req.body.name ||
!req.body.year.toString().match(/^[0-9]{4}$/g) ||
!req.body.rating.toString().match(/^[0-9]\.[0-9]$/g) ||
!req.params.id.toString().match(/^[0-9]{3,}$/g)){
res.status(400);
res.json({message: "Bad Request"});
} else {
//Gets us the index of movie with given id.
var updateIndex = movies.map(function(movie){
return movie.id;
}).indexOf(parseInt(req.params.id));
if(updateIndex === -1){
//Movie not found, create new
movies.push({
id: req.params.id,
name: req.body.name,
year: req.body.year,
rating: req.body.rating
});
res.json({
message: "New movie created.", location: "/movies/" + req.params.id});
} else {
//Update existing movie
movies[updateIndex] = {
id: req.params.id,
name: req.body.name,
year: req.body.year,
rating: req.body.rating
};
res.json({message: "Movie id " + req.params.id + " updated.",
location: "/movies/" + req.params.id});
}
}
});
router.delete('/:id', function(req, res){
var removeIndex = movies.map(function(movie){
return movie.id;
}).indexOf(req.params.id); //Gets us the index of movie with given id.
if(removeIndex === -1){
res.json({message: "Not found"});
} else {
movies.splice(removeIndex, 1);
res.send({message: "Movie id " + req.params.id + " removed."});
}
});
module.exports = router;
Ini melengkapi REST API kami. Sekarang Anda dapat membuat aplikasi yang jauh lebih kompleks menggunakan gaya arsitektur sederhana dan Express ini.