গ্রাফকিউএল (GraphQL) এবং REST API হল দুটি জনপ্রিয় API প্রযুক্তি, তবে তাদের কাজের পদ্ধতি আলাদা। GraphQL একটি কুয়েরি ভাষা এবং রUNTIME যা ক্লায়েন্টদের নির্দিষ্ট ডেটা চাওয়ার ক্ষমতা দেয়, যেখানে REST API ডেটা অ্যাক্সেসের জন্য একাধিক এন্ডপয়েন্ট ব্যবহার করে। কিন্তু অনেক সময়, অ্যাপ্লিকেশনগুলিতে GraphQL এবং REST API একসাথে ব্যবহার করার প্রয়োজন হতে পারে, যেমন একটি অ্যাপ্লিকেশনে কিছু ডেটা REST API থেকে আনা হচ্ছে, আবার অন্য কিছু GraphQL-এ সার্ভ করা হচ্ছে।
এখানে GraphQL এবং REST API একসাথে Integration করার বিভিন্ন পদ্ধতি আলোচনা করা হলো।
GraphQL এবং REST API Integration কেন প্রয়োজন?
- Legacy Systems: অনেক সময় পুরনো (legacy) সিস্টেমে REST API ব্যবহৃত হয়। নতুন অ্যাপ্লিকেশনগুলো GraphQL ব্যবহার করতে চাইলে, পুরনো সিস্টেমের ডেটা GraphQL API-এ ইন্টিগ্রেট করা হতে পারে।
- হাইব্রিড অ্যাপ্লিকেশন: কিছু অ্যাপ্লিকেশন যেখানে একটি অংশ GraphQL এবং অন্য অংশ REST API ব্যবহার করে। যেমন কিছু কুয়েরি GraphQL এর মাধ্যমে এবং কিছু মিউটেশন REST API এর মাধ্যমে করা হতে পারে।
- REST API-এর সাথে কাজ করার সুবিধা: REST API কিছু নির্দিষ্ট প্রক্রিয়া বা অ্যাপ্লিকেশন কেসের জন্য কার্যকরী হতে পারে, এবং GraphQL সহজে এই REST API থেকে ডেটা নিতে সক্ষম।
REST API কে GraphQL এর মাধ্যমে ইন্টিগ্রেট করা
আপনি যখন REST API এবং GraphQL একসাথে ব্যবহার করতে চান, তখন GraphQL Resolvers এর মাধ্যমে REST API কে ইন্টিগ্রেট করতে পারেন। Resolvers হল গ্রাফকিউএল স্কিমার অংশ যা ডেটা ফেরত আনার জন্য ব্যবহৃত হয়।
ধাপ ১: REST API থেকে ডেটা আনা
ধরা যাক, আপনি একটি REST API থেকে ইউজারের তথ্য নিতে চান। প্রথমে, আপনাকে REST API-এর রিকোয়েস্ট করার জন্য কোনো HTTP ক্লায়েন্ট ব্যবহার করতে হবে, যেমন Axios বা node-fetch।
npm install axios
ধাপ ২: GraphQL Resolver তৈরি করা
এখন, REST API থেকে ডেটা আনার জন্য একটি resolver তৈরি করুন।
const axios = require('axios');
// GraphQL Resolver যা REST API কল করে
const resolvers = {
Query: {
getUser: async (_, { id }) => {
try {
const response = await axios.get(`https://jsonplaceholder.typicode.com/users/${id}`);
return response.data;
} catch (error) {
throw new Error("Error fetching data from REST API");
}
},
},
};
এখানে, getUser নামক একটি GraphQL Query তৈরি করা হয়েছে যা REST API কল করে ইউজারের তথ্য নিয়ে আসে।
ধাপ ৩: Apollo Server সেটআপ
এখন, Apollo Server সেটআপ করতে হবে, যেখানে আমরা GraphQL schema এবং resolver সেটআপ করব।
const { ApolloServer, gql } = require('apollo-server');
// GraphQL Schema
const typeDefs = gql`
type User {
id: ID
name: String
username: String
email: String
}
type Query {
getUser(id: ID!): User
}
`;
const server = new ApolloServer({
typeDefs,
resolvers,
});
server.listen().then(({ url }) => {
console.log(`Server ready at ${url}`);
});
এখানে, আমরা একটি User টাইপ এবং একটি getUser কুয়েরি তৈরি করেছি যা REST API থেকে ইউজারের তথ্য ফেরত আনে।
REST API এবং GraphQL এ Data ম্যানিপুলেশন
GraphQL Mutation ব্যবহার করে আপনি REST API থেকে ডেটা ম্যানিপুলেশন (যেমন, ডেটা আপডেট বা ডিলিট) করতে পারেন।
ধাপ ১: REST API থেকে ডেটা আপডেট করা
ধরা যাক, আমরা একটি REST API-কে ব্যবহার করে ইউজারের তথ্য আপডেট করতে চাই। এটি GraphQL Mutation এর মাধ্যমে করা যেতে পারে।
const axios = require('axios');
const resolvers = {
Mutation: {
updateUser: async (_, { id, name }) => {
try {
const response = await axios.put(`https://jsonplaceholder.typicode.com/users/${id}`, {
name: name,
});
return response.data;
} catch (error) {
throw new Error("Error updating data in REST API");
}
},
},
};
এখানে, updateUser একটি mutation যা REST API কল করে ইউজারের নাম আপডেট করে এবং নতুন তথ্য ফেরত আনে।
ধাপ ২: GraphQL Mutation তৈরি করা
const typeDefs = gql`
type User {
id: ID
name: String
username: String
email: String
}
type Mutation {
updateUser(id: ID!, name: String!): User
}
`;
এখানে, আমরা একটি updateUser মিউটেশন তৈরি করেছি যা ইউজারের নাম আপডেট করার জন্য ব্যবহৃত হয়।
REST API এবং GraphQL এর মধ্যে তথ্য সংগ্রহের ক্ষেত্রে পার্থক্য
- REST API: REST API-তে, আপনি একাধিক এন্ডপয়েন্ট ব্যবহার করে একাধিক রিসোর্সের জন্য আলাদা আলাদা রিকোয়েস্ট পাঠাতে হয়। এটি ক্লায়েন্ট এবং সার্ভারের মধ্যে অতিরিক্ত ডেটা ট্রান্সফার করতে পারে এবং অনেক সময় অপ্রয়োজনীয় ডেটা ফেরত আসে।
- GraphQL: GraphQL-এর মাধ্যমে, ক্লায়েন্টরা কেবলমাত্র তাদের প্রয়োজনীয় ডেটার ফিল্ড চেয়ে নিতে পারে, ফলে অপ্রয়োজনীয় ডেটা অ্যাড করা হয় না এবং একক কুয়েরি দ্বারা সমস্ত সম্পর্কিত ডেটা প্রাপ্ত করা সম্ভব হয়।
REST API এবং GraphQL Integration এর সুবিধা
- Flexible Data Fetching: গ্রাফকিউএল ক্লায়েন্টদের তাদের প্রয়োজনীয় ডেটার জন্য নির্দিষ্ট প্রশ্ন করতে দেয়, যা REST API থেকে অ্যাক্সেস করা সম্ভব নয়।
- Single Endpoint: GraphQL একক এন্ডপয়েন্টে সমস্ত ডেটার জন্য কাজ করে, যেখানে REST API-তে একাধিক এন্ডপয়েন্ট ব্যবহার করতে হয়।
- Incremental Adoption: যদি আপনার অ্যাপ্লিকেশন পুরনো REST API ব্যবহার করে, তাহলে GraphQL-এ ধীরে ধীরে রূপান্তর করা সম্ভব। আপনি GraphQL কুয়েরি করতে REST API-এর মধ্যে একত্রিত করতে পারেন, যেমন আমরা উপরে দেখিয়েছি।
- Reduced Over-fetching: গ্রাফকিউএল কেবলমাত্র প্রয়োজনীয় ডেটা ফেরত দেয়, যেখানে REST API অনেক সময় অতিরিক্ত ডেটা ফেরত দেয়।
সারাংশ
GraphQL এবং REST API একসাথে ব্যবহারের মাধ্যমে আপনি দুটি প্রযুক্তির সুবিধা গ্রহণ করতে পারেন। যেখানে গ্রাফকিউএল নমনীয় ডেটা অনুসন্ধান এবং কমপ্লেক্স রিলেশনশিপ পরিচালনা করতে সাহায্য করে, REST API প্রাচীন বা নির্দিষ্ট ক্ষেত্রে কার্যকরী হতে পারে। GraphQL Resolver ব্যবহার করে আপনি REST API থেকে ডেটা সংগ্রহ এবং ম্যানিপুলেশন করতে পারেন, ফলে দুটি প্রযুক্তির মধ্যে সেমি-ইন্টিগ্রেশন সম্ভব হয়।
গ্রাফকিউএল (GraphQL) এবং REST API একে অপরের বিকল্প নয়, বরং তারা একে অপরের সাথে সমন্বিতভাবে কাজ করতে পারে। GraphQL এবং REST API এর মধ্যে কিছু মৌলিক পার্থক্য থাকলেও, একটি প্রকল্পে উভয়কেই একত্রে ব্যবহার করা সম্ভব, এবং এটি অনেক ক্ষেত্রেই কার্যকরী হতে পারে। এই ইন্টিগ্রেশনটির মাধ্যমে আপনি দুটি প্রযুক্তির শক্তি একত্রিত করতে পারেন এবং যেকোনো ধরনের ডেটা বা কার্যকারিতা দক্ষতার সাথে অ্যাক্সেস করতে পারবেন।
এখানে REST API এর সাথে GraphQL এর ইন্টিগ্রেশন নিয়ে বিস্তারিত আলোচনা করা হবে।
REST API এবং GraphQL ইন্টিগ্রেশন কেন প্রয়োজন?
- পূর্ববর্তী ইনফ্রাস্ট্রাকচারের সাথে সামঞ্জস্য: অনেক অ্যাপ্লিকেশন ইতিমধ্যে REST API ব্যবহার করছে। যখন আপনি নতুন GraphQL ফিচার যোগ করতে চান, তখন সম্পূর্ণ অ্যাপ্লিকেশন পুনর্লিখনের পরিবর্তে, REST API এবং GraphQL কে একত্রে ব্যবহার করা কার্যকর হতে পারে।
- নতুন ফিচার যোগ করা: GraphQL ব্যবহার করে নতুন ডেটা ফিচার যোগ করা যেতে পারে, যখন REST API পুরনো বা ঐতিহ্যবাহী ফিচারগুলির জন্য ব্যবহার করা হতে পারে।
- ডেটা ম্যানিপুলেশন: কিছু ক্ষেত্রে, কিছু ডেটা ম্যানিপুলেশন বা ব্যবসায়িক লজিক REST API-এর মাধ্যমে সহজে করা যেতে পারে, এবং অন্যান্য জটিল ডেটা কুয়েরি গ্রাফকিউএল দ্বারা পরিচালিত হতে পারে।
REST API এবং GraphQL এর সাথে ইন্টিগ্রেশন করার পদ্ধতি
GraphQL সার্ভার REST API কে ব্যাকএন্ড হিসেবে ব্যবহার করতে পারে, অর্থাৎ GraphQL ক্লায়েন্ট REST API থেকে ডেটা গ্রহণ করতে এবং সে ডেটা ব্যবহার করে গ্রাফকিউএল কুয়েরি সম্পাদন করতে পারে। সাধারণত, Apollo Server বা Express.js এর মাধ্যমে এই ইন্টিগ্রেশনটি করা হয়।
ধাপ ১: REST API সার্ভার তৈরি করা
ধরা যাক, আপনি একটি সাধারণ REST API তৈরি করেছেন যেটি কিছু ইউজারের তথ্য প্রদান করে। এখানে একটি সাধারণ Express.js REST API তৈরি করা হলো:
const express = require('express');
const app = express();
app.get('/api/users', (req, res) => {
res.json([
{ id: 1, name: 'John Doe', email: 'john@example.com' },
{ id: 2, name: 'Jane Doe', email: 'jane@example.com' }
]);
});
app.listen(3000, () => {
console.log('REST API server running on port 3000');
});
এখানে, REST API ইউজারের একটি তালিকা /api/users এন্ডপয়েন্টে প্রদান করছে।
ধাপ ২: Apollo Server বা GraphQL সার্ভার তৈরি করা
এখন আমরা GraphQL সার্ভার তৈরি করব যা এই REST API কে ইন্টিগ্রেট করবে। এজন্য Apollo Server ব্যবহার করা যেতে পারে।
- প্রথমে, প্রয়োজনীয় প্যাকেজ ইন্সটল করুন:
npm install apollo-server express graphql axios
- তারপর, Apollo Server ব্যবহার করে GraphQL সার্ভার তৈরি করুন যা REST API থেকে ডেটা আনে:
const { ApolloServer, gql } = require('apollo-server');
const axios = require('axios');
// GraphQL Schema
const typeDefs = gql`
type User {
id: ID!
name: String
email: String
}
type Query {
users: [User]
}
`;
// Resolvers to fetch data from REST API
const resolvers = {
Query: {
users: async () => {
try {
const response = await axios.get('http://localhost:3000/api/users');
return response.data;
} catch (error) {
throw new Error('Error fetching data from REST API');
}
}
}
};
// Create Apollo Server
const server = new ApolloServer({ typeDefs, resolvers });
server.listen().then(({ url }) => {
console.log(`GraphQL Server ready at ${url}`);
});
এখানে:
- axios ব্যবহার করা হয়েছে REST API থেকে ডেটা ফেচ করার জন্য।
- গ্রাফকিউএল
usersকুয়েরি চালানোর মাধ্যমে REST API-তে/api/usersএন্ডপয়েন্ট থেকে ডেটা ফেচ করা হচ্ছে।
ধাপ ৩: GraphQL ক্লায়েন্ট থেকে কুয়েরি করা
এখন, আপনার GraphQL ক্লায়েন্টকে গ্রাফকিউএল API এ কুয়েরি করতে সক্ষম হবে, যা REST API থেকে ডেটা এনে ফেরত দেবে। একটি সাধারণ কুয়েরি হবে:
query {
users {
id
name
email
}
}
এই কুয়েরি GraphQL API এ পাঠালে, Apollo Server এটি REST API /api/users এন্ডপয়েন্টে পাঠাবে এবং ইউজারের তথ্য ফেরত আনবে।
REST API এবং GraphQL ইন্টিগ্রেশন করার সুবিধা
- ডেটা এক্সেস সহজতর: আপনি REST API থেকে ডেটা গ্রাফকিউএল কুয়েরি মাধ্যমে খুব সহজে অ্যাক্সেস করতে পারবেন। এর মাধ্যমে REST API-এর ডেটাকে GraphQL এর ফিল্টারিং, পেজিনেশন এবং কাস্টম কুয়েরি ক্ষমতা সহ ব্যবহার করা যাবে।
- প্রথমে REST API তারপর GraphQL: যদি আপনি একটি পুরানো REST API ব্যবহার করেন তবে GraphQL এর মাধ্যমে নতুন ফিচার যোগ করার সময় পুরো API পুনর্লিখন করার দরকার নেই। GraphQL নতুন ফিচার সুনির্দিষ্টভাবে পরিচালনা করবে, এবং পুরনো REST API ব্যবহার করা যাবে।
- একাধিক ডেটার উৎসের মধ্যে ইন্টিগ্রেশন: GraphQL অন্যান্য ডেটার উৎসের (যেমন, অন্যান্য REST API, ডাটাবেস, বা SOAP সেবা) সাথে একত্রিত হয়ে একক কুয়েরি বা মিউটেশন থেকে ডেটা ফেরত আনতে পারে। এটি REST API-এর সাথে একত্রিত হয়ে আপনার অ্যাপ্লিকেশনকে আরও শক্তিশালী এবং নমনীয় করে তোলে।
- কাস্টম ডেটা ম্যানিপুলেশন: GraphQL কুয়েরি দিয়ে আপনি REST API থেকে আনা ডেটার উপর অতিরিক্ত ম্যানিপুলেশন বা প্রক্রিয়া করতে পারবেন, যেমন কাস্টম ফিল্টারিং বা ট্রান্সফরমেশন।
সারাংশ
REST API এবং GraphQL এর মধ্যে ইন্টিগ্রেশন একটি শক্তিশালী পদ্ধতি যা উভয় প্রযুক্তির সুবিধা একত্রে ব্যবহার করতে দেয়। যখন আপনার অ্যাপ্লিকেশন একটি পুরনো REST API ব্যবহার করে এবং আপনি নতুন ফিচার বা উন্নত ডেটা কুয়েরি ক্ষমতা চান, তখন GraphQL তার মাধ্যমে REST API থেকে ডেটা ফেচ করে এবং একটি ইন্টারফেস প্রদান করে যেটি আরো কার্যকরী এবং নমনীয়। এটি গ্রাফকিউএল এর শক্তিশালী কুয়েরি ক্ষমতা এবং REST API এর সহজ ডেটা এক্সেস সুবিধাকে একত্রিত করে, যা উন্নত পারফরম্যান্স এবং ফিচার সম্প্রসারণের সুযোগ দেয়।
GraphQL Gateway ব্যবহার করে REST API ব্যবস্থাপনা হল একটি আধুনিক পদ্ধতি যা গ্রাফকিউএল-এর শক্তি ব্যবহার করে REST API-এর কার্যকারিতা একত্রিত করে এবং একটি একক GraphQL API তৈরি করে। এটি বিশেষভাবে উপকারী যখন আপনার মাইক্রোসার্ভিস বা বিভিন্ন REST API রয়েছে এবং আপনি তাদের একত্রিত করে একটি মধ্যস্থতাকারী API তৈরি করতে চান।
এখানে, GraphQL Gateway এর মাধ্যমে REST API ব্যবস্থাপনা করার পদ্ধতি বিস্তারিতভাবে ব্যাখ্যা করা হলো।
GraphQL Gateway কী?
GraphQL Gateway হল একটি কাস্টম API গেটওয়ে যা multiple GraphQL APIs এবং REST APIs একত্রিত করে একটি ইউনিফাইড API প্রদান করে। এটি ব্যবহারকারীদের একক GraphQL কুয়েরি-এর মাধ্যমে বিভিন্ন REST API বা GraphQL API-এর ডেটা একত্রে নিয়ে আসতে সক্ষম করে।
GraphQL Gateway গ্রাফকিউএল সার্ভিসের স্কিমা গুলি একত্রিত করে, এবং তাদের মধ্যে ডেটা এক্সচেঞ্জের জন্য একটি সিঙ্গেল এক্সেস পয়েন্ট সরবরাহ করে।
GraphQL Gateway এর কাজ:
- একাধিক REST API থেকে ডেটা একত্রিত করা।
- সমস্ত REST API কুয়েরি বা মিউটেশনকে একটি GraphQL API এর মধ্যে ফেডারেট করা।
- Backend সার্ভিস বা ডেটাবেসের মধ্যে একটি single point of entry তৈরি করা।
GraphQL Gateway ব্যবহার করে REST API Integration
ধরা যাক, আপনার অ্যাপ্লিকেশনে কিছু REST API রয়েছে যা পৃথকভাবে বিভিন্ন ডেটা সার্ভিস (যেমন, ইউজার ডেটা, প্রোডাক্ট ডেটা, ইত্যাদি) প্রদান করে। আপনি যদি একটি GraphQL API তৈরি করতে চান যা এই সমস্ত REST API থেকে ডেটা একত্রিত করবে, তাহলে Apollo Server এবং Apollo Gateway ব্যবহার করে এটি বাস্তবায়ন করা সম্ভব।
ধাপ ১: REST API থেকে ডেটা নেওয়া
ধরা যাক, আমাদের দুটি REST API রয়েছে:
- User API: ব্যবহারকারীদের তথ্য প্রদান করে।
- Product API: প্রোডাক্টের তথ্য প্রদান করে।
আমরা এই দুটি REST API কে GraphQL Gateway মাধ্যমে একত্রিত করতে চাই।
ধাপ ২: Apollo Server এর মাধ্যমে REST API ইন্টিগ্রেশন
Apollo Server একটি GraphQL সার্ভার তৈরি করতে ব্যবহৃত হয় যা REST API-এর সাথে সংযুক্ত থাকে। আপনি Apollo Server ব্যবহার করে RESTDataSource ক্লাসটি ব্যবহার করতে পারেন, যা REST API থেকে ডেটা ফেচ করতে সহায়ক।
- User Service (REST API):
const { RESTDataSource } = require('apollo-datasource-rest');
class UserAPI extends RESTDataSource {
constructor() {
super();
this.baseURL = 'https://jsonplaceholder.typicode.com/';
}
async getUser(id) {
return this.get(`users/${id}`);
}
}
module.exports = UserAPI;
- Product Service (REST API):
const { RESTDataSource } = require('apollo-datasource-rest');
class ProductAPI extends RESTDataSource {
constructor() {
super();
this.baseURL = 'https://fakestoreapi.com/';
}
async getProduct(id) {
return this.get(`products/${id}`);
}
}
module.exports = ProductAPI;
এখানে:
- UserAPI এবং ProductAPI ক্লাস ব্যবহার করে REST API থেকে ডেটা ফেচ করা হয়েছে।
ধাপ ৩: Apollo Gateway সেটআপ
এখন, আমরা Apollo Gateway ব্যবহার করে এই দুটি REST API থেকে ডেটা একত্রিত করব। আমরা দুটি সাবস্কিমা তৈরি করেছি — একটি ইউজার API এর জন্য এবং একটি প্রোডাক্ট API এর জন্য। তারপর Apollo Gateway সেইসব স্কিমাকে একত্রিত করবে।
const { ApolloServer, gql } = require('apollo-server');
const { ApolloGateway } = require('@apollo/gateway');
const UserAPI = require('./userAPI');
const ProductAPI = require('./productAPI');
// Gateway configuration
const gateway = new ApolloGateway({
serviceList: [
{ name: 'users', url: 'http://localhost:4001' }, // User service
{ name: 'products', url: 'http://localhost:4002' } // Product service
]
});
const server = new ApolloServer({
gateway,
subscriptions: false // subscriptions disabled
});
server.listen(4000).then(({ url }) => {
console.log(`Server ready at ${url}`);
});
এখানে:
- Apollo Gateway ব্যবহার করে আমরা দুটি আলাদা REST API সার্ভিসের স্কিমা একত্রিত করেছি, এবং একটি single GraphQL API তৈরি করেছি।
ধাপ ৪: Query করার উদাহরণ
এখন আপনি একটি সাধারণ GraphQL Query ব্যবহার করে দুটি REST API থেকে ডেটা একত্রে পেতে পারবেন:
query {
user(id: 1) {
name
email
}
product(id: 1) {
title
price
}
}
এখানে:
user(id: 1)কুয়েরি User API থেকে ইউজারের তথ্য নিয়ে আসবে।product(id: 1)কুয়েরি Product API থেকে প্রোডাক্টের তথ্য নিয়ে আসবে।
Apollo Gateway সমস্ত REST API থেকে ডেটা একত্রিত করে একক GraphQL API এর মাধ্যমে তা প্রদান করবে।
GraphQL Gateway এর মাধ্যমে REST API ব্যবস্থাপনা এর সুবিধা
- Centralized API: বিভিন্ন REST API-এর ডেটা একত্রিত করে একটি centralized GraphQL API তৈরি করা সম্ভব, যা ডেভেলপারদের জন্য সহজ এবং সুবিধাজনক।
- Single Entry Point: একটি একক API ব্যবহার করে, ক্লায়েন্টরা সমস্ত ডেটা একত্রে এক্সেস করতে পারে, এবং সার্ভারের উপর অতিরিক্ত চাপ কমে যায়।
- Scalability: নতুন REST API বা GraphQL সার্ভিস সহজে যোগ করা যায়, এবং সমস্ত সার্ভিস একত্রিত হয়ে একটি সুসংহত GraphQL API প্রদান করে।
- Flexibility: গ্রাহকরা শুধুমাত্র প্রয়োজনীয় ডেটা চেয়ে নিতে পারে, ফলে over-fetching সমস্যাও এড়ানো যায়।
- Easy Integration: আপনি যদি বিদ্যমান REST API ব্যবস্থাকে GraphQL API তে একত্রিত করতে চান, তাহলে Apollo Server এবং Apollo Gateway সহজেই সেটআপ করা যায়।
সারাংশ
GraphQL Gateway একটি অত্যন্ত কার্যকরী উপায় REST API ব্যবস্থাপনা করার জন্য। এটি একাধিক REST API কে একত্রিত করে একক GraphQL API প্রদান করতে সক্ষম করে, যার ফলে ক্লায়েন্টরা সমস্ত তথ্য একত্রে সহজে পেতে পারে। Apollo Server এবং Apollo Gateway ব্যবহার করে, আপনি দ্রুত এবং কার্যকরীভাবে REST API Integration পরিচালনা করতে পারেন এবং আপনার অ্যাপ্লিকেশনের স্কেলবিলিটি এবং কার্যকারিতা বাড়াতে পারেন।
গ্রাফকিউএল (GraphQL) এবং REST API একসাথে ব্যবহার করা অনেক সময় সুবিধাজনক হতে পারে, বিশেষ করে যখন আপনি গ্রাফকিউএল ব্যবহার করে REST API এর উপর একটি নতুন লেয়ার তৈরি করতে চান। এটি একটি সাধারণ কৌশল হতে পারে যেখানে আপনি REST API থেকে ডেটা সংগ্রহ করেন এবং তারপর গ্রাফকিউএল কুয়েরি বা মিউটেশন এর মাধ্যমে সেই ডেটা সরবরাহ করেন। এই পদ্ধতির মাধ্যমে আপনি REST API এর সুবিধা গ্রহণ করতে পারেন এবং একই সময়ে গ্রাফকিউএল এর নমনীয়তা এবং দক্ষতা ব্যবহার করতে পারেন।
এখানে আমরা GraphQL-এর মাধ্যমে REST API-র উপরে একটি লেয়ার তৈরি করার প্রক্রিয়া দেখাব।
GraphQL এর মাধ্যমে REST API এর উপরে একটি লেয়ার তৈরি করার সুবিধা
- নমনীয় ডেটা অনুসন্ধান: গ্রাফকিউএল ক্লায়েন্টদের নির্দিষ্ট ফিল্ড চেয়ে নিতে দেয়, যার ফলে আপনি শুধুমাত্র প্রয়োজনীয় ডেটা ফিরিয়ে আনতে পারবেন।
- একক এন্ডপয়েন্ট: REST API-তে বিভিন্ন এন্ডপয়েন্টের মাধ্যমে ডেটা পাঠানো হয়, কিন্তু গ্রাফকিউএল একটি একক এন্ডপয়েন্ট ব্যবহার করে সমস্ত ডেটা সংগ্রহ করা সম্ভব।
- ডেটা ফিল্টারিং: গ্রাফকিউএল কুয়েরি ব্যবহার করে আপনি বিভিন্ন প্যারামিটার ভিত্তিতে ডেটা ফিল্টার করতে পারেন এবং REST API এর তুলনায় আরও কাস্টমাইজড ডেটা অ্যাক্সেস করতে পারবেন।
- একত্রিত ডেটা: একাধিক REST API থেকে ডেটা সংগ্রহ করে গ্রাফকিউএল এর মাধ্যমে একত্রিত করা যায়।
ধাপ ১: REST API কল করার জন্য একটি Resolver তৈরি করা
গ্রাফকিউএল-এর Resolvers ব্যবহার করে আমরা REST API থেকে ডেটা সংগ্রহ করতে পারি। এ ক্ষেত্রে, আমরা Axios অথবা node-fetch এর মতো HTTP ক্লায়েন্ট ব্যবহার করে REST API-কে কল করব।
- Axios ইন্সটল করা:
npm install axios
- GraphQL Resolver তৈরি করা:
ধরা যাক, আপনি একটি REST API ব্যবহার করে ইউজারের তথ্য অ্যাক্সেস করতে চান। নিচে একটি উদাহরণ দেওয়া হলো যেখানে গ্রাফকিউএল রেজোলভার REST API থেকে ডেটা কল করছে।
const axios = require('axios');
// GraphQL Resolver যা REST API কল করে
const resolvers = {
Query: {
getUser: async (_, { id }) => {
try {
const response = await axios.get(`https://jsonplaceholder.typicode.com/users/${id}`);
return response.data;
} catch (error) {
throw new Error("Error fetching data from REST API");
}
},
},
};
এখানে, getUser গ্রাফকিউএল কুয়েরি রেজোলভার হিসেবে কাজ করছে এবং এটি REST API-কে কল করে ইউজারের তথ্য ফেরত আনে।
ধাপ ২: Apollo Server এবং GraphQL Schema সেটআপ
এখন, গ্রাফকিউএল স্কিমা এবং রেজোলভার তৈরি করার পর Apollo Server চালু করতে হবে। নীচে একটি উদাহরণ দেওয়া হলো:
const { ApolloServer, gql } = require('apollo-server');
const axios = require('axios');
// GraphQL Schema
const typeDefs = gql`
type User {
id: ID
name: String
username: String
email: String
}
type Query {
getUser(id: ID!): User
}
`;
const resolvers = {
Query: {
getUser: async (_, { id }) => {
try {
const response = await axios.get(`https://jsonplaceholder.typicode.com/users/${id}`);
return response.data;
} catch (error) {
throw new Error("Error fetching data from REST API");
}
},
},
};
const server = new ApolloServer({
typeDefs,
resolvers,
});
server.listen().then(({ url }) => {
console.log(`Server ready at ${url}`);
});
এখানে:
getUserকুয়েরি গ্রাফকিউএল API এর মাধ্যমে ইউজারের ডেটা ফেরত আনে।- ApolloServer কনফিগার করা হয়েছে যাতে আপনি সহজেই গ্রাফকিউএল কুয়েরি রিকোয়েস্ট করতে পারেন।
ধাপ ৩: REST API থেকে আরও ডেটা সংগ্রহ এবং ম্যানিপুলেশন
আপনি আরও অনেক REST API একসাথে গ্রাফকিউএল রেজোলভার ব্যবহার করে একত্রিত করতে পারেন। ধরুন, আপনি একটি REST API থেকে ইউজারের ডেটা এবং আরেকটি REST API থেকে ইউজারের পোষ্ট সংগ্রহ করতে চান। নিচে একটি উদাহরণ দেওয়া হলো:
const resolvers = {
Query: {
getUserAndPosts: async (_, { id }) => {
try {
const userResponse = await axios.get(`https://jsonplaceholder.typicode.com/users/${id}`);
const postsResponse = await axios.get(`https://jsonplaceholder.typicode.com/posts?userId=${id}`);
return {
user: userResponse.data,
posts: postsResponse.data,
};
} catch (error) {
throw new Error("Error fetching data from REST API");
}
},
},
};
এখানে:
getUserAndPostsএকটি নতুন কুয়েরি, যা একই সময়ে ইউজারের তথ্য এবং তার পোষ্টগুলি REST API থেকে একসাথে নিয়ে আসে।
GraphQL Schema আপডেট
type Post {
id: ID
title: String
body: String
}
type UserWithPosts {
user: User
posts: [Post]
}
type Query {
getUserAndPosts(id: ID!): UserWithPosts
}
এখানে:
- UserWithPosts নামক টাইপটি ব্যবহার করা হয়েছে যাতে ইউজার এবং তার পোষ্ট একসাথে রিটার্ন করা যায়।
ধাপ ৪: GraphQL এবং REST API এর মধ্যে ত্রুটি হ্যান্ডলিং
REST API থেকে ডেটা সংগ্রহের সময় ত্রুটি মোকাবেলা করা গুরুত্বপূর্ণ। আপনি এটি সহজে try-catch ব্লক ব্যবহার করে করতে পারেন, যাতে যে কোনও ত্রুটি সংঘটিত হলে তা সঠিকভাবে গ্রাহককে জানানো যায়।
const resolvers = {
Query: {
getUser: async (_, { id }) => {
try {
const response = await axios.get(`https://jsonplaceholder.typicode.com/users/${id}`);
return response.data;
} catch (error) {
throw new Error("Error fetching data from REST API");
}
},
},
};
এখানে:
try-catchব্লকের মাধ্যমে ত্রুটি ঘটলে Error এর মাধ্যমে ক্লায়েন্টকে ত্রুটি বার্তা পাঠানো হচ্ছে।
সারাংশ
GraphQL এর মাধ্যমে REST API এর উপরে একটি লেয়ার তৈরি করা একটি শক্তিশালী এবং নমনীয় পদ্ধতি, যেখানে আপনি REST API থেকে ডেটা সংগ্রহ করেন এবং গ্রাফকিউএল কুয়েরি বা মিউটেশন এর মাধ্যমে তা সরবরাহ করেন। এর মাধ্যমে আপনি ডেটা ফিল্টারিং, একত্রিত ডেটা সংগ্রহ, এবং ত্রুটি হ্যান্ডলিং সহজভাবে করতে পারবেন। Apollo Server এবং Axios ব্যবহার করে এই ইন্টিগ্রেশনটি খুব সহজেই করা সম্ভব।
Apollo Federation হল একটি শক্তিশালী টুল যা বিভিন্ন GraphQL সার্ভার একত্রিত করার জন্য ব্যবহৃত হয়, যাতে আপনি একটি বৃহত এবং মডুলার GraphQL API তৈরি করতে পারেন। এটি একাধিক সার্ভারের মধ্যে REST API ইন্টিগ্রেশনকে সহজ করে তোলে এবং একাধিক মাইক্রো সার্ভিসের মধ্যে ডেটা একত্রিত করে একটি কেন্দ্রীয় GraphQL API প্রদান করে।
Apollo Federation ব্যবহার করে REST API একত্রিত করার মাধ্যমে আপনি REST API এবং GraphQL এর শক্তি একত্রে ব্যবহার করতে পারেন। এর মাধ্যমে আপনি REST API থেকে ডেটা একত্রিত করে একটি একক GraphQL API তৈরি করতে পারেন।
Apollo Federation কী?
Apollo Federation হল একটি ওপেন সোর্স আর্কিটেকচার যা একটি বা একাধিক GraphQL সার্ভারকে একত্রিত করে একটি মাইক্রো সার্ভিস আর্কিটেকচারে কাজ করতে সহায়ক। এর মাধ্যমে আপনি REST API, SQL/NoSQL ডেটাবেস এবং অন্যান্য গ্রাফকিউএল সার্ভারগুলি একত্রে ব্যবহার করতে পারেন এবং একটি একক ইন্টারফেস তৈরি করতে পারেন।
REST API এর সাথে Apollo Federation ইন্টিগ্রেশন
Apollo Federation এবং Apollo Server ব্যবহার করে REST API একত্রিত করার জন্য কিছু স্টেপ অনুসরণ করতে হবে। নিচে এই প্রক্রিয়াটি বিস্তারিতভাবে ব্যাখ্যা করা হলো।
ধাপ ১: Apollo Federation সার্ভার সেটআপ করা
প্রথমে Apollo Server এবং Apollo Federation প্যাকেজ ইন্সটল করতে হবে।
npm install @apollo/server @apollo/federation graphql
ধাপ ২: REST API গুলো তৈরি করা
ধরা যাক, আপনার একটি REST API রয়েছে যা একটি প্রোডাক্টের তথ্য প্রদান করে। আপনি একটি REST API ফিচার তৈরির জন্য Express.js এবং Axios ব্যবহার করতে পারেন।
const express = require('express');
const axios = require('axios');
const app = express();
app.get('/products', async (req, res) => {
const response = await axios.get('https://fakestoreapi.com/products');
res.json(response.data);
});
app.listen(4001, () => {
console.log('REST API running on port 4001');
});
এখানে একটি সাধারণ REST API তৈরি করা হয়েছে যা Products এর তথ্য প্রদান করবে।
ধাপ ৩: REST API কে GraphQL সার্ভারে একত্রিত করা
এখন Apollo Federation এর সাহায্যে REST API কে GraphQL সার্ভারের মধ্যে একত্রিত করতে হবে। Apollo Server এর @restDataSource ব্যবহার করে REST API কে GraphQL API-তে রূপান্তর করা যায়।
npm install @apollo/server @apollo/federation graphql @apollo/datasource-rest
এখানে আমরা @apollo/datasource-rest প্যাকেজ ব্যবহার করব REST API একত্রিত করার জন্য।
const { ApolloServer } = require('@apollo/server');
const { gql } = require('graphql-tag');
const { RESTDataSource } = require('@apollo/datasource-rest');
const { buildFederatedSchema } = require('@apollo/federation');
// REST API data source
class ProductsAPI extends RESTDataSource {
constructor() {
super();
this.baseURL = 'https://fakestoreapi.com';
}
async getProducts() {
return this.get('/products');
}
async getProductById(id) {
return this.get(`/products/${id}`);
}
}
// GraphQL schema definition
const typeDefs = gql`
type Product @key(fields: "id") {
id: ID!
title: String
price: Float
description: String
}
type Query {
products: [Product]
product(id: ID!): Product
}
`;
// Resolvers
const resolvers = {
Query: {
products: async (_, __, { dataSources }) => {
return dataSources.productsAPI.getProducts();
},
product: async (_, { id }, { dataSources }) => {
return dataSources.productsAPI.getProductById(id);
},
},
Product: {
__resolveReference: async (product, { dataSources }) => {
return dataSources.productsAPI.getProductById(product.id);
},
},
};
// Create the Apollo Server
const server = new ApolloServer({
schema: buildFederatedSchema([{ typeDefs, resolvers }]),
dataSources: () => ({
productsAPI: new ProductsAPI(),
}),
});
server.listen({ port: 4002 }).then(({ url }) => {
console.log(`GraphQL Server ready at ${url}`);
});
ধাপ ৪: REST API কে GraphQL API-তে একত্রিত করা
- ProductsAPI একটি RESTDataSource যা আপনার REST API থেকে ডেটা নিয়ে আসে।
- typeDefs এবং resolvers GraphQL সার্ভারের জন্য স্কিমা এবং লজিক সংজ্ঞায়িত করে। এখানে, Product এর তথ্য GraphQL-এ পাওয়া যাবে এবং REST API থেকে ডেটা ফেচ করা হবে।
- buildFederatedSchema ব্যবহার করা হয়েছে যাতে এটি একটি federated GraphQL স্কিমা তৈরি করতে পারে, যা অন্যান্য GraphQL সার্ভারের সাথে একত্রিত হতে সক্ষম।
ধাপ ৫: REST API কে Federation সহ GraphQL সার্ভারে ইন্টিগ্রেট করা
এখন, আপনি যখন products বা product কুয়েরি করবেন, তখন এই ডেটা REST API থেকে ফেচ হয়ে আসবে এবং আপনার Apollo Federation সার্ভারের মাধ্যমে GraphQL API হিসেবে সরবরাহ করা হবে।
GraphQL Query উদাহরণ
এখন, আপনি Apollo Federation সার্ভার থেকে ডেটা কুয়েরি করতে পারবেন:
query {
products {
id
title
price
description
}
}
এবং, আপনি যদি একটি নির্দিষ্ট প্রোডাক্টের তথ্য চান:
query {
product(id: 1) {
id
title
price
description
}
}
এগুলো Apollo Federation ব্যবহার করে আপনার REST API কে GraphQL API-তে রূপান্তর করবে এবং ডেটা ফিরিয়ে দিবে।
সারাংশ
Apollo Federation ব্যবহার করে REST API-কে একটি GraphQL API-তে রূপান্তর করা সহজ এবং কার্যকরী। এটি একটি মডুলার আর্কিটেকচার তৈরি করতে সাহায্য করে, যেখানে আপনি একাধিক সার্ভিস বা মাইক্রো সার্ভিসের GraphQL ইন্টিগ্রেশন করতে পারেন। এই পদ্ধতিতে, Apollo Server, RESTDataSource, এবং Federation এর সাহায্যে আপনি আপনার REST API থেকে ডেটা নিয়ে আসতে এবং একটি একক GraphQL API তৈরি করতে পারেন যা অন্যান্য সার্ভিসের সাথে একত্রিত হতে সক্ষম।
Read more