REST API এবং GraphQL দুটি জনপ্রিয় API স্টাইল যা ক্লায়েন্ট এবং সার্ভারের মধ্যে ডেটা আদান-প্রদান করতে ব্যবহৃত হয়। KoaJS এর মাধ্যমে আপনি উভয় API স্টাইলের সাথে কাজ করতে পারেন। এই টিউটোরিয়ালে, আমরা REST API এবং GraphQL এর মধ্যে তুলনা করব, তাদের সুবিধা এবং অসুবিধা নিয়ে আলোচনা করব।
১. REST API
REST (Representational State Transfer) একটি আর্কিটেকচারাল স্টাইল যা HTTP প্রোটোকলের উপর নির্ভরশীল। এটি একটি নির্দিষ্ট নিয়মের মাধ্যমে সিস্টেমের মধ্যে রিকোয়েস্ট এবং রেসপন্স পরিচালনা করে। RESTful API-তে সাধারণত URL (Uniform Resource Locator) ব্যবহার করা হয়, এবং HTTP মেথডগুলি (GET, POST, PUT, DELETE) ক্লায়েন্ট এবং সার্ভারের মধ্যে ডেটার আদান-প্রদান পরিচালনা করতে ব্যবহৃত হয়।
১.১. REST API-এর মূল বৈশিষ্ট্য:
- সিম্পল এবং স্ট্যান্ডার্ডাইজড: REST API খুবই সিম্পল এবং এর জন্য HTTP মেথড এবং স্ট্যাটাস কোডের স্ট্যান্ডার্ড ব্যবহার করা হয়।
- Resourse-based: REST API ডেটা রিসোর্স (যেমন:
/users,/products) অনুযায়ী কাজ করে। - Stateless: প্রতি রিকোয়েস্টে সার্ভারকে সব তথ্য পাঠাতে হয়, কারণ প্রতিটি রিকোয়েস্ট একক এবং সার্ভার সেশন বজায় রাখে না।
- Caching: REST APIতে ডেটা ক্যাশিং সহজে করা যায়, যা সার্ভারের লোড কমাতে সাহায্য করে।
১.২. REST API উদাহরণ (KoaJS)
const Koa = require('koa');
const Router = require('koa-router');
const app = new Koa();
const router = new Router();
// GET রিকোয়েস্ট হ্যান্ডলিং
router.get('/users', async (ctx) => {
ctx.body = [{ id: 1, name: 'John Doe' }];
});
// POST রিকোয়েস্ট হ্যান্ডলিং
router.post('/users', async (ctx) => {
const user = ctx.request.body;
ctx.status = 201;
ctx.body = { message: 'User created', data: user };
});
app.use(router.routes()).use(router.allowedMethods());
app.listen(3000, () => {
console.log('Server running on http://localhost:3000');
});
এখানে:
/usersURL থেকে ব্যবহারকারীদের ডেটা ফেচ করার জন্য GET রিকোয়েস্ট পাঠানো হয়েছে।- POST রিকোয়েস্ট ব্যবহার করে নতুন ইউজার তৈরি করা হচ্ছে।
২. GraphQL
GraphQL একটি API কুয়েরি ভাষা যা ডেটা ফেচ করার জন্য একটি অত্যন্ত নমনীয় এবং শক্তিশালী পদ্ধতি প্রদান করে। এটি ক্লায়েন্টকে একসাথে একাধিক রিসোর্সের জন্য কুয়েরি পাঠানোর সুযোগ দেয়, এবং সার্ভার কেবলমাত্র প্রয়োজনীয় ডেটা ফেরত দেয়। GraphQL মূলত একটি নির্দিষ্ট স্কিমা অনুসরণ করে, যেখানে ডেটা টাইপ, কুয়েরি, এবং মিউটেশন সম্পর্কে স্পষ্টভাবে নির্ধারণ করা হয়।
২.১. GraphQL-এর মূল বৈশিষ্ট্য:
- একটি কুয়েরি ভাষা: GraphQL ক্লায়েন্টকে নির্দিষ্ট ডেটা কুয়েরি করতে দেয় এবং সার্ভার কেবলমাত্র প্রয়োজনীয় ডেটা রিটার্ন করে।
- ফ্লেক্সিবল ডেটা: একাধিক রিসোর্সের জন্য একযোগে কুয়েরি করা যায়, যা ক্লায়েন্টের জন্য সহজ এবং পারফরম্যান্সের উন্নতি করতে সাহায্য করে।
- Strongly Typed: GraphQL এ ডেটার টাইপ এবং স্কিমা স্পষ্টভাবে সংজ্ঞায়িত থাকে।
- Single Endpoint: REST API যেখানে একাধিক এন্ডপয়েন্ট থাকে, GraphQL শুধুমাত্র একটি এন্ডপয়েন্ট (এটি সাধারনত
/graphqlহয়) ব্যবহার করে।
২.২. GraphQL উদাহরণ (KoaJS)
const Koa = require('koa');
const Router = require('koa-router');
const { ApolloServer, gql } = require('apollo-server-koa');
const app = new Koa();
const router = new Router();
// GraphQL স্কিমা এবং রেজলভার
const typeDefs = gql`
type User {
id: ID!
name: String!
}
type Query {
users: [User]
}
type Mutation {
addUser(name: String!): User
}
`;
const resolvers = {
Query: {
users: () => [{ id: 1, name: 'John Doe' }]
},
Mutation: {
addUser: (_, { name }) => ({ id: 2, name })
}
};
// Apollo Server সেটআপ
const server = new ApolloServer({ typeDefs, resolvers });
server.applyMiddleware({ app }); // GraphQL এন্ডপয়েন্ট
app.listen(3000, () => {
console.log('GraphQL server running at http://localhost:3000/graphql');
});
এখানে:
- ApolloServer ব্যবহার করে GraphQL API তৈরি করা হয়েছে।
- typeDefs: ডেটার স্কিমা সংজ্ঞায়িত করা হয়েছে, যেখানে
Userটাইপ এবং Query ও Mutation নির্দেশনা দেওয়া হয়েছে। - resolvers: কুয়েরি এবং মিউটেশন হ্যান্ডল করার জন্য রেজলভার তৈরি করা হয়েছে।
৩. REST API এবং GraphQL এর তুলনা
| বৈশিষ্ট্য | REST API | GraphQL |
|---|---|---|
| ডেটার আউটপুট | নির্দিষ্ট এন্ডপয়েন্টে নির্দিষ্ট ডেটা আউটপুট | কাস্টম কুয়েরি অনুযায়ী কেবলমাত্র প্রয়োজনীয় ডেটা আউটপুট |
| এন্ডপয়েন্ট সংখ্যা | একাধিক এন্ডপয়েন্ট (বিভিন্ন রিসোর্সের জন্য) | একটি একক এন্ডপয়েন্ট /graphql |
| ডেটা ফেচ করার পদ্ধতি | একাধিক রিকোয়েস্ট (প্রত্যেক রিসোর্সের জন্য) | এক কুয়েরি দিয়ে একাধিক রিসোর্সের ডেটা ফেচ করা যায় |
| ডেটা পরিবর্তন | PUT, POST, DELETE, PATCH | Mutation কুয়েরি ব্যবহার করে ডেটা পরিবর্তন করা যায় |
| স্ট্রাকচার | রিসোর্স-ভিত্তিক (URL অনুযায়ী) | স্কিমা-ভিত্তিক (ডেটার টাইপ এবং কুয়েরি স্কিমা নির্ধারণ) |
| সার্ভারের পারফরম্যান্স | একাধিক রিকোয়েস্টের জন্য সার্ভারকে চাপ দেওয়া | এক কুয়েরি দিয়ে কম রিকোয়েস্ট এবং কম ব্যান্ডউইথ ব্যবহার |
৪. কোনটি বেছে নেবেন?
- REST API: যদি আপনি একটি সিম্পল, স্ট্যান্ডার্ড এবং পরিচিত API চান যা সহজেই বিভিন্ন ক্লায়েন্ট এবং সার্ভিসের সাথে কাজ করে, তবে REST API উপযুক্ত হতে পারে।
- GraphQL: যদি আপনার অ্যাপ্লিকেশনটির জটিল ডেটা কাঠামো থাকে এবং আপনি কেবলমাত্র প্রয়োজনীয় ডেটা চান যা একাধিক রিসোর্স থেকে আসবে, তবে GraphQL হবে একটি উন্নত বিকল্প।
সারাংশ
REST API এবং GraphQL উভয়ই শক্তিশালী এবং জনপ্রিয় API স্টাইল, তবে তাদের ব্যবহারের ক্ষেত্রে কিছু গুরুত্বপূর্ণ পার্থক্য রয়েছে। REST API সাধারণত সিম্পল এবং স্ট্যান্ডার্ড হয়, যেখানে GraphQL একটি নমনীয় এবং কাস্টমাইজড পদ্ধতি যা ক্লায়েন্টকে নির্দিষ্ট ডেটা কুয়েরি করার সুযোগ দেয়। KoaJS-এর মাধ্যমে উভয় API স্টাইলের সাথে কাজ করা সম্ভব এবং প্রতিটি ক্ষেত্রে আপনাকে প্রয়োজন অনুযায়ী API ডিজাইন করতে হবে।
Read more