Koa.js - रेस्टफुल एपीआई
मोबाइल एप्लिकेशन, सिंगल पेज एप्लिकेशन बनाने के लिए, AJAX कॉल का उपयोग करें और ग्राहकों को डेटा प्रदान करें, आपको एपीआई की आवश्यकता होगी। इन APIs और समापन बिंदुओं की संरचना और नाम कैसे करें की एक लोकप्रिय स्थापत्य शैली कहा जाता हैREST(Representational Transfer State)। HTTP 1.1 को REST सिद्धांतों को ध्यान में रखते हुए डिजाइन किया गया था। द्वारा शुरू किया गया थाRoy Fielding 2000 में अपने पेपर फील्डिंग शोध प्रबंध में।
RESTful URI और विधियाँ हमें लगभग सभी जानकारी प्रदान करती हैं जिन्हें हमें अनुरोध करने की आवश्यकता होती है। निम्न तालिका संक्षेप में बताती है कि विभिन्न क्रियाओं का उपयोग कैसे किया जाना चाहिए और URI का नाम कैसे होना चाहिए। हम अंत में एक मूवी एपीआई बना रहे हैं, तो आइए चर्चा करें कि यह कैसे संरचित होगा।
तरीका | यूआरआई | विवरण | समारोह |
---|---|---|---|
प्राप्त | /चलचित्र | सुरक्षित, कछुआ | सभी फिल्मों की सूची और उनका विवरण प्राप्त करता है |
प्राप्त | / फिल्मों / 1234 | सुरक्षित, कछुआ | मूवी आईडी 1234 का विवरण मिलता है |
पद | /चलचित्र | एन / ए | विवरण के साथ एक नई फिल्म बनाता है। प्रतिक्रिया में इस नए बनाए गए संसाधन के लिए URI शामिल है। |
डाल | / फिल्मों / 1234 | idempotent | मूवी आईडी 1234 को संशोधित करता है (यदि यह पहले से मौजूद नहीं है तो एक बनाता है)। प्रतिक्रिया में इस नए बनाए गए संसाधन के लिए URI शामिल है। |
हटाएँ | / फिल्मों / 1234 | idempotent | मूवी आईडी 1234 को हटा दिया जाना चाहिए, अगर यह मौजूद है। प्रतिक्रिया में अनुरोध की स्थिति होनी चाहिए। |
DELETE या PUT | /चलचित्र | अमान्य | अमान्य होना चाहिए। DELETE और PUT को निर्दिष्ट करना चाहिए कि वे किस संसाधन पर काम कर रहे हैं। |
अब कोआ में इस API को बनाते है। हम JSON का उपयोग अपने परिवहन डेटा प्रारूप के रूप में करेंगे क्योंकि यह जावास्क्रिप्ट में काम करना आसान है और इसमें अन्य लाभों का भार है। अपनी index.js फ़ाइल को निम्न के साथ बदलें -
INDEX.JS
var koa = require('koa');
var router = require('koa-router');
var bodyParser = require('koa-body');
var app = koa();
//Set up body parsing middleware
app.use(bodyParser({
formidable:{uploadDir: './uploads'},
multipart: true,
urlencoded: true
}));
//Require the Router we defined in movies.js
var movies = require('./movies.js');
//Use the Router on the sub route /movies
app.use(movies.routes());
app.listen(3000);
अब हमारे पास अपना एप्लिकेशन सेट अप हो गया है, आइए हम एपीआई बनाने पर ध्यान केंद्रित करें। सबसे पहले Movies.js फ़ाइल सेट करें। हम फिल्मों को संग्रहीत करने के लिए डेटाबेस का उपयोग नहीं कर रहे हैं, लेकिन उन्हें मेमोरी में स्टोर कर रहे हैं, इसलिए हर बार जब सर्वर हमारे द्वारा जोड़ी गई फिल्मों को फिर से चालू करता है तो वह गायब हो जाएगा। यह आसानी से डेटाबेस या फ़ाइल (नोड एफएस मॉड्यूल का उपयोग करके) का उपयोग करके नकल की जा सकती है।
कोआ-राउटर आयात करें, एक राउटर बनाएं और मॉड्यूल.एक्सपोर्ट का उपयोग करके इसे निर्यात करें।
var Router = require('koa-router');
var router = Router({
prefix: '/movies'
}); //Prefixed all routes with /movies
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;
रूट प्राप्त करें
सभी फिल्में प्राप्त करने के लिए GET मार्ग को परिभाषित करें।
router.get('/', sendMovies);
function *sendMovies(next){
this.body = movies;
yield next;
}
बस। यह जांचने के लिए कि क्या यह ठीक काम कर रहा है, अपना ऐप चलाएं, फिर अपना टर्मिनल खोलें और दर्ज करें -
curl -i -H "Accept: application/json" -H "Content-Type: application/json" -X GET localhost:3000/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,})', sendMovieWithId);
function *sendMovieWithId(next){
var ctx = this;
var currMovie = movies.filter(function(movie){
if(movie.id == ctx.params.id){
return true;
}
});
if(currMovie.length == 1){
this.body = currMovie[0];
} else {
this.response.status = 404;//Set status to 404 as movie was not found
this.body = {message: "Not Found"};
}
yield next;
}
यह हमें उस आईडी के अनुसार फिल्में मिलेंगी जो हम प्रदान करते हैं। इसका परीक्षण करने के लिए, अपने टर्मिनल में निम्न कमांड का उपयोग करें।
curl -i -H "Accept: application/json" -H "Content-Type: application/json" -X GET localhost:3000/movies/101
आपको प्रतिक्रिया इस प्रकार मिलेगी -
{"id":101,"name":"Fight Club","year":1999,"rating":8.1}
यदि आप एक अमान्य मार्ग पर जाते हैं, तो यह एक GET त्रुटि उत्पन्न नहीं कर सकता है, जबकि यदि आप किसी मान्य मार्ग पर जाते हैं, जिसमें कोई id नहीं है, तो यह 404 त्रुटि उत्पन्न करेगा।
हमें GET मार्गों के साथ किया जाता है। अब, हम POST मार्ग पर चलते हैं।
पोस्ट रूट
POSTed डेटा को संभालने के लिए निम्न मार्ग का उपयोग करें।
router.post('/', addNewMovie);
function *addNewMovie(next){
//Check if all fields are provided and are valid:
if(!this.request.body.name ||
!this.request.body.year.toString().match(/^[0-9]{4}$/g) ||
!this.request.body.rating.toString().match(/^[0-9]\.[0-9]$/g)){
this.response.status = 400;
this.body = {message: "Bad Request"};
} else {
var newId = movies[movies.length-1].id+1;
movies.push({
id: newId,
name: this.request.body.name,
year: this.request.body.year,
rating: this.request.body.rating
});
this.body = {message: "New movie created.", location: "/movies/" + newId};
}
yield next;
}
यह एक नई फिल्म बनाएगा और इसे मूवी चर में संग्रहीत करेगा। इस मार्ग का परीक्षण करने के लिए, अपने टर्मिनल में निम्नलिखित दर्ज करें -
curl -X POST --data "name = Toy%20story&year = 1995&rating = 8.5"
https://localhost:3000/movies
आपको निम्न प्रतिक्रिया मिलेगी -
{"message":"New movie created.","location":"/movies/105"}
यह जाँचने के लिए कि क्या यह फ़िल्म ऑब्जेक्ट में जोड़ा गया है, फिर से / फिल्मों / 105 के लिए अनुरोध प्राप्त करें। आपको निम्न प्रतिक्रिया मिलेगी -
{"id":105,"name":"Toy story","year":"1995","rating":"8.5"}
PUT और DELETE रूट बनाने के लिए आगे बढ़ते हैं।
रूट रूट
PUT मार्ग लगभग POST मार्ग के समान है। हम उस वस्तु के लिए आईडी निर्दिष्ट करेंगे जो अपडेट / बनाई जाएगी। निम्नलिखित तरीके से मार्ग बनाएँ -
router.put('/:id', updateMovieWithId);
function *updateMovieWithId(next){
//Check if all fields are provided and are valid:
if(!this.request.body.name ||
!this.request.body.year.toString().match(/^[0-9]{4}$/g) ||
!this.request.body.rating.toString().match(/^[0-9]\.[0-9]$/g) ||
!this.params.id.toString().match(/^[0-9]{3,}$/g)){
this.response.status = 400;
this.body = {message: "Bad Request"};
} else {
//Gets us the index of movie with given id.
var updateIndex = movies.map(function(movie){
return movie.id;
}).indexOf(parseInt(this.params.id));
if(updateIndex === -1){
//Movie not found, create new movies.push({
id: this.params.id,
name: this.request.body.name,
year: this.request.body.year,
rating: this.request.body.rating
});
this.body = {message: "New movie created.", location: "/movies/" + this.params.id};
} else {
//Update existing movie
movies[updateIndex] = {
id: this.params.id,
name: this.request.body.name,
year: this.request.body.year,
rating: this.request.body.rating
};
this.body = {message: "Movie id " + this.params.id + " updated.", location: "/movies/" + this.params.id};
}
}
}
यह मार्ग उपरोक्त तालिका में निर्दिष्ट कार्य करेगा। यदि यह मौजूद है तो यह नए विवरण के साथ ऑब्जेक्ट को अपडेट करेगा। यदि यह मौजूद नहीं है, तो यह एक नई वस्तु बनाएगा। इस मार्ग का परीक्षण करने के लिए, निम्नलिखित कर्ल कमांड का उपयोग करें। यह एक मौजूदा फिल्म को अपडेट करेगा। एक नई मूवी बनाने के लिए, बस आईडी को गैर-मौजूदा आईडी में बदलें।
curl -X PUT --data "name = Toy%20story&year = 1995&rating = 8.5"
https://localhost:3000/movies/101
प्रतिक्रिया
{"message":"Movie id 101 updated.","location":"/movies/101"}
DELETE मार्ग
डिलीट रूट बनाने के लिए निम्न कोड का उपयोग करें।
router.delete('/:id', deleteMovieWithId);
function *deleteMovieWithId(next){
var removeIndex = movies.map(function(movie){
return movie.id;
}).indexOf(this.params.id); //Gets us the index of movie with given id.
if(removeIndex === -1){
this.body = {message: "Not found"};
} else {
movies.splice(removeIndex, 1);
this.body = {message: "Movie id " + this.params.id + " removed."};
}
}
उसी तरह से मार्ग का परीक्षण करें जैसा हमने दूसरों के लिए किया है। सफल विलोपन पर (उदाहरण के लिए आईडी 105), आपको मिलेगा -
{message: "Movie id 105 removed."}
अंत में, हमारी फिल्में। Js फाइल दिखती हैं -
var Router = require('koa-router');
var router = Router({
prefix: '/movies'
}); //Prefixed all routes with /movies
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
router.get('/', sendMovies);
router.get('/:id([0-9]{3,})', sendMovieWithId);
router.post('/', addNewMovie);
router.put('/:id', updateMovieWithId);
router.delete('/:id', deleteMovieWithId);
function *deleteMovieWithId(next){
var removeIndex = movies.map(function(movie){
return movie.id;
}).indexOf(this.params.id); //Gets us the index of movie with given id.
if(removeIndex === -1){
this.body = {message: "Not found"};
} else {
movies.splice(removeIndex, 1);
this.body = {message: "Movie id " + this.params.id + " removed."};
}
}
function *updateMovieWithId(next) {
//Check if all fields are provided and are valid:
if(!this.request.body.name ||
!this.request.body.year.toString().match(/^[0-9]{4}$/g) ||
!this.request.body.rating.toString().match(/^[0-9]\.[0-9]$/g) ||
!this.params.id.toString().match(/^[0-9]{3,}$/g)){
this.response.status = 400;
this.body = {message: "Bad Request"};
} else {
//Gets us the index of movie with given id.
var updateIndex = movies.map(function(movie){
return movie.id;
}).indexOf(parseInt(this.params.id));
if(updateIndex === -1){
//Movie not found, create new
movies.push({
id: this.params.id,
name: this.request.body.name,
year: this.request.body.year,
rating: this.request.body.rating
});
this.body = {message: "New movie created.", location: "/movies/" + this.params.id};
} else {
//Update existing movie
movies[updateIndex] = {
id: this.params.id,
name: this.request.body.name,
year: this.request.body.year,
rating: this.request.body.rating
};
this.body = {message: "Movie id " + this.params.id + " updated.",
location: "/movies/" + this.params.id};
}
}
}
function *addNewMovie(next){
//Check if all fields are provided and are valid:
if(!this.request.body.name ||
!this.request.body.year.toString().match(/^[0-9]{4}$/g) ||
!this.request.body.rating.toString().match(/^[0-9]\.[0-9]$/g)){
this.response.status = 400;
this.body = {message: "Bad Request"};
} else {
var newId = movies[movies.length-1].id+1;
movies.push({
id: newId,
name: this.request.body.name,
year: this.request.body.year,
rating: this.request.body.rating
});
this.body = {message: "New movie created.", location: "/movies/" + newId};
}
yield next;
}
function *sendMovies(next){
this.body = movies;
yield next;
}
function *sendMovieWithId(next){
var ctx = this
var currMovie = movies.filter(function(movie){
if(movie.id == ctx.params.id){
return true;
}
});
if(currMovie.length == 1){
this.body = currMovie[0];
} else {
this.response.status = 404;//Set status to 404 as movie was not found
this.body = {message: "Not Found"};
}
yield next;
}
module.exports = router;
यह हमारे REST API को पूरा करता है। अब आप इस सरल वास्तुशिल्प शैली और Koa का उपयोग करके अधिक जटिल अनुप्रयोग बना सकते हैं।