আজকের আধুনিক সফটওয়্যার ইঞ্জিনিয়ারিং দুনিয়ায় API (Application Programming Interface) হলো সেই মূল ভিত্তি বা সেতু, যা সম্পূর্ণ ভিন্ন দুটি সফটওয়্যার সিস্টেমকে নিজেদের মধ্যে নির্বিঘ্নে ডেটা আদান-প্রদান করতে সাহায্য করে।
ধরো, তুমি একটি রেস্টুরেন্টে খেতে গিয়েছ। তুমি (Client) মেনু দেখে ঠিক করলে কী খাবে। কিন্তু তুমি সরাসরি রান্নাঘরে (Server) গিয়ে খাবার আনতে পারো না। এই কাজটি করে একজন ওয়েটার (API)। তুমি ওয়েটারকে তোমার অর্ডার (Request) দাও, সে সেটা রান্নাঘরে পৌঁছে দেয় এবং খাবার তৈরি হলে তোমার টেবিলে এনে পরিবেশন করে (Response)।
ব্যাকএন্ড ডেভেলপমেন্ট বা API ইন্টিগ্রেশন নিয়ে কাজ করতে গেলে অনেকগুলো টেকনিক্যাল টার্মের সম্মুখীন হতে হয়। এই টার্মগুলোর সঠিক অর্থ না জানলে আর্কিটেকচার ডিজাইন করা বা ডিবাগিং করা কঠিন হয়ে পড়ে। যেহেতু তুমি পাইথন এবং জাভা নিয়ে কাজ করো, তাই এই কনসেপ্টগুলো গভীরভাবে বোঝা তোমার প্রতিদিনের কাজের জন্যই অত্যন্ত জরুরি। চলো, API-এর জগতের সবচেয়ে গুরুত্বপূর্ণ টার্মগুলো বিস্তারিতভাবে জেনে নিই।
বেসিক টার্মস (Basic Terms)
API (Application Programming Interface): এটি একগুচ্ছ নিয়ম ও প্রোটোকলের সমষ্টি, যা নির্ধারণ করে কীভাবে একাধিক সফটওয়্যার কম্পোনেন্ট একে অপরের সাথে যোগাযোগ করবে।
Endpoint: এটি হলো API-এর একটি নির্দিষ্ট ডেস্টিনেশন বা URL, যেখানে রিকুয়েস্ট পাঠালে একটি নির্দিষ্ট কাজ হয় বা ডেটা পাওয়া যায়।
Request: ক্লায়েন্ট যখন সার্ভারের কাছে কোনো নির্দিষ্ট ডেটা চায় বা কোনো অ্যাকশন পারফর্ম করতে বলে। একটি স্ট্যান্ডার্ড রিকুয়েস্টে হেডার (Headers), বডি (Body/Payload) এবং HTTP মেথড থাকে।
Response: রিকুয়েস্ট প্রসেস করার পর সার্ভার ক্লায়েন্টকে যে ফলাফল বা ডেটা ফেরত দেয়। এতে সাধারণত স্ট্যাটাস কোড (যেমন: 200 OK, 404 Not Found) এবং কাঙ্ক্ষিত ডেটা থাকে।
Client: যে সিস্টেম, অ্যাপ্লিকেশন বা ব্রাউজার API কল করে। যেমন: ফ্রন্টএন্ড ওয়েব অ্যাপ, মোবাইল অ্যাপ বা অন্য কোনো মাইক্রোসার্ভিস।
Server: যে শক্তিশালী সিস্টেমে API হোস্ট করা থাকে এবং যা ক্লায়েন্টের রিকুয়েস্ট রিসিভ করে লজিক প্রসেস শেষে রেসপন্স জেনারেট করে।
Resource: API-এর মাধ্যমে অ্যাক্সেস করা যায় এমন যেকোনো ডেটা বা এন্টিটি। যেমন: ডাটাবেসের
user,orderবাproduct।URI (Uniform Resource Identifier): একটি নির্দিষ্ট রিসোর্সকে ইউনিকভাবে শনাক্ত করার স্ট্রিং।
URL (Uniform Resource Locator): এটি এক প্রকার URI, যা রিসোর্সটি ইন্টারনেটে ঠিক কোথায় অবস্থান করছে তার সম্পূর্ণ ওয়েব ঠিকানা নির্দেশ করে (যেমন:
[https://api.zeroslab.com/v1/users](https://api.zeroslab.com/v1/users))।HTTP (Hypertext Transfer Protocol): ওয়েবে ক্লায়েন্ট ও সার্ভারের মধ্যে ডেটা আদান-প্রদানের প্রধান প্রোটোকল।
এইচটিটিপি মেথডস (HTTP Methods)
RESTful API-তে রিসোর্সের উপর কী ধরনের অপারেশন হবে তা বোঝাতে বিভিন্ন HTTP মেথড ব্যবহার করা হয়।
GET: সার্ভার থেকে ডেটা রিড বা আনার জন্য ব্যবহার হয়। এটি সার্ভারের কোনো ডেটা পরিবর্তন করে না।
POST: সার্ভারে নতুন ডেটা বা রিসোর্স তৈরি করার জন্য ব্যবহার হয়।
PUT: সার্ভারে বিদ্যমান কোনো রিসোর্সকে পুরোপুরি (complete replace) আপডেট বা ওভাররাইট করার জন্য ব্যবহৃত হয়।
PATCH: বিদ্যমান রিসোর্সের আংশিক (partial) আপডেট করার জন্য ব্যবহৃত হয়।
DELETE: সার্ভার থেকে কোনো নির্দিষ্ট ডেটা মুছে ফেলার জন্য ব্যবহৃত হয়।
এপিআই এর ধরন (API Types)
REST (Representational State Transfer): বর্তমানে সবচেয়ে জনপ্রিয় আর্কিটেকচারাল স্টাইল। এটি HTTP প্রোটোকল ব্যবহার করে, স্টেটলেস (stateless) এবং ক্লায়েন্ট-সার্ভার মডেল মেনে চলে।
GraphQL: ফেসবুকের তৈরি একটি আধুনিক কুয়েরি ল্যাঙ্গুয়েজ। REST-এ ফিক্সড এন্ডপয়েন্ট থাকে, কিন্তু GraphQL-এ ক্লায়েন্ট ঠিক যতটুকু ডেটা চায়, ঠিক ততটুকুই রিকুয়েস্ট করতে পারে।
SOAP (Simple Object Access Protocol): একটি প্রোটোকল যা এক্সএমএল (XML) নির্ভর। এটি বেশ কঠোর নিয়ম মেনে চলে এবং সিকিউরিটি (WS-Security) অত্যন্ত শক্তিশালী হওয়ায় ব্যাংকিং বা এন্টারপ্রাইজ সিস্টেমে বেশি ব্যবহৃত হয়।
WebSocket: রিয়েল-টাইম, বাই-ডিরেকশনাল (bidirectional) কমিউনিকেশনের জন্য ব্যবহৃত হয়। একবার কানেকশন তৈরি হলে ক্লায়েন্ট ও সার্ভার উভয়েই যেকোনো সময় ডেটা আদান-প্রদান করতে পারে (যেমন: চ্যাট অ্যাপ্লিকেশন বা লাইভ নোটিফিকেশন)।
gRPC: গুগলের তৈরি একটি হাই-পারফরম্যান্স RPC ফ্রেমওয়ার্ক। এটি HTTP/2 প্রোটোকল এবং Protocol Buffers (Protobuf) ব্যবহার করে, যা মাইক্রোসার্ভিস আর্কিটেকচারে খুব দ্রুত ডেটা ট্রান্সফার করতে সাহায্য করে।
অথেনটিকেশন এবং সিকিউরিটি (Authentication & Security)
API Key: এটি একটি সিক্রেট টোকেন বা ইউনিক স্ট্রিং, যা API কল করার সময় ক্লায়েন্টকে শনাক্ত করার জন্য ব্যবহার করা হয়।
OAuth 2.0: একটি বহুল ব্যবহৃত অথোরাইজেশন ফ্রেমওয়ার্ক। এটি থার্ড-পার্টি অ্যাপ্লিকেশনগুলোকে ইউজারের পাসওয়ার্ড শেয়ার না করেই তার ডেটা অ্যাক্সেস করার অনুমতি দেয় (যেমন: "Login with Google")।
JWT (JSON Web Token): এটি ক্লায়েন্ট এবং সার্ভারের মধ্যে সিকিউরড ডেটা ট্রান্সফার করার একটি ওপেন স্ট্যান্ডার্ড। টোকেনটি তিনটি অংশে বিভক্ত থাকে (Header, Payload, Signature) এবং স্টেটলেস অথেনটিকেশনে (যেমন Spring Security বা FastAPI-তে) ব্যাপকভাবে ব্যবহৃত হয়।
Token-based Authentication: ইউজার একবার লগইন করলে সার্ভার একটি টোকেন জেনারেট করে দেয়। ক্লায়েন্ট পরবর্তী প্রতিটি রিকুয়েস্টের সাথে হেডারে (Authorization: Bearer ) সেই টোকেনটি পাঠায়।
CORS (Cross-Origin Resource Sharing): এটি সার্ভারকে নির্ধারণ করতে দেয় যে, অন্য কোনো ডোমেইন (Origin) থেকে তার API-তে রিকুয়েস্ট করা যাবে কি না।
Rate Limiting: সার্ভারকে ওভারলোড বা DDoS অ্যাটাক থেকে বাঁচাতে নির্দিষ্ট সময়ের মধ্যে একজন ইউজার বা IP কতগুলো রিকুয়েস্ট করতে পারবে তার একটি সীমা নির্ধারণ করে দেওয়া।
Throttling: রেট লিমিট অতিক্রম করলে রিকুয়েস্ট পুরোপুরি ব্লক না করে সার্ভারের রেসপন্স ধীর করে দেওয়ার প্রক্রিয়া, যাতে সার্ভার ক্র্যাশ না করে।
ডেটা ফরম্যাট (Data Format)
JSON (JavaScript Object Notation): বর্তমানে API-এর সবচেয়ে জনপ্রিয় ডেটা ফরম্যাট। এটি কি-ভ্যালু (key-value) পেয়ার হিসেবে থাকে, আকারে খুব হালকা এবং সহজে পার্স করা যায়।
XML (eXtensible Markup Language): এটি একটি ট্যাগ-ভিত্তিক ডেটা ফরম্যাট। এটি কিছুটা ভারী এবং সাধারণত লিগ্যাসি সিস্টেম বা SOAP API-তে ব্যবহৃত হয়।
YAML (YAML Ain't Markup Language): এটি মানুষের পড়ার জন্য সবচেয়ে সহজ ডেটা ফরম্যাট। সাধারণত CI/CD পাইপলাইন, ডকার (Docker) বা কুবেরনেটিস (Kubernetes) কনফিগারেশন লিখতে এটি ব্যবহৃত হয়।
Form Data / URL Encoded: HTML ফর্ম থেকে ফাইল আপলোড (
multipart/form-data) এবং সাধারণ টেক্সট ডেটা (application/x-www-form-urlencoded) HTTP রিকুয়েস্টে পাঠানোর সনাতন পদ্ধতি।
এপিআই ডকুমেন্টেশন এবং টুলস (API Documentation & Tools)
Swagger / OpenAPI: API-এর স্ট্রাকচার ডিজাইন এবং ডকুমেন্টেশন তৈরি করার একটি শক্তিশালী ফ্রেমওয়ার্ক। এর মাধ্যমে সরাসরি ব্রাউজার থেকে API টেস্ট করা সম্ভব।
Postman: API ডেভেলপমেন্ট এবং টেস্টিংয়ের জন্য সবচেয়ে জনপ্রিয় টুল। এর মাধ্যমে রিকুয়েস্ট তৈরি করা, রেসপন্স দেখা এবং অটোমেটেড টেস্ট লেখা যায়।
Insomnia: এটি Postman-এর একটি চমৎকার বিকল্প। এটি তুলনামূলকভাবে লাইটওয়েট এবং গ্রাফকিউএল ও gRPC রিকুয়েস্ট হ্যান্ডলিংয়ের জন্য খুব জনপ্রিয়।
API Gateway: মাইক্রোসার্ভিস আর্কিটেকচারে এটি একটি সেন্ট্রাল এন্ট্রি পয়েন্ট হিসেবে কাজ করে। গেটওয়ে রাউটিং, রেট লিমিটিং, এবং গ্লোবাল অথেনটিকেশন হ্যান্ডেল করে।
API Versioning: API তে বড় কোনো পরিবর্তন (Breaking change) আনলে পুরনো ক্লায়েন্টদের যাতে সমস্যা না হয়, সেজন্য API-এর ভার্সন মেইনটেইন করা হয় (যেমন:
/api/v1/usersএবং/api/v2/users)।
পারফরম্যান্স এবং অপটিমাইজেশন (Performance & Optimization)
Over-fetching: যখন ক্লায়েন্ট API-এর কাছ থেকে তার প্রয়োজনীয় ডেটার চেয়ে অনেক বেশি অতিরিক্ত ডেটা রিসিভ করে। এতে মেমরি ও ব্যান্ডউইথ নষ্ট হয়।
Under-fetching: যখন একটি রিকুয়েস্টে প্রয়োজনীয় সব ডেটা পাওয়া যায় না এবং সম্পূর্ণ ডেটা পেতে ক্লায়েন্টকে একাধিকবার আলাদা রিকুয়েস্ট করতে হয় (N+1 প্রবলেম)।
Pagination: ডাটাবেসে লাখ লাখ রেকর্ড থাকলে API একবারে সব ডেটা পাঠায় না। এর বদলে ছোট ছোট খণ্ডে (page/limit/offset) ডেটা পাঠায়।
Caching: বারবার ডাটাবেস কুয়েরি না করে, প্রথম রিকুয়েস্টের ফলাফল মেমরিতে (যেমন: Redis) সাময়িকভাবে সেভ করে রাখা, যাতে পরবর্তীতে দ্রুত রেসপন্স দেওয়া যায়।
Latency: ক্লায়েন্ট রিকুয়েস্ট পাঠানোর পর থেকে রেসপন্স পাওয়া পর্যন্ত যে সময়টুকু লাগে।
Timeout: রিকুয়েস্ট পাঠানোর পর একটি নির্দিষ্ট সময় পার হয়ে গেলে যদি রেসপন্স না আসে, তবে কানেকশনটি নিজে থেকেই বন্ধ হয়ে যাওয়া।
Webhooks: ক্লায়েন্ট বারবার সার্ভারকে ডেটার জন্য রিকুয়েস্ট করার বদলে, সার্ভারেই কোনো নির্দিষ্ট ইভেন্ট ঘটলে সার্ভার নিজে থেকেই ক্লায়েন্টের নির্দিষ্ট URL-এ ডেটা পুশ (Push) করে জানিয়ে দেয়।
পাইথন এবং জাভাতে এপিআই ইমপ্লিমেন্টেশন (API Implementation in Python and Java)
নিচে পাইথন (FastAPI) এবং জাভা (Spring Boot) ব্যবহার করে বেসিক API Endpoint তৈরি এবং কল করার উদাহরণ দেওয়া হলো।
Python Example (FastAPI - Creating an API):
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
app = FastAPI()
class User(BaseModel):
name: str
role: str
users_database = {}
@app.get("/api/v1/users/{user_id}")
def get_user(user_id: int):
if user_id not in users_database:
raise HTTPException(status_code=404, detail="User resource not found")
return {"status": "success", "data": users_database[user_id]}
@app.post("/api/v1/users/{user_id}")
def create_user(user_id: int, user: User):
users_database[user_id] = user
return {"status": "created", "data": user}Python Example (Requests - Calling an API Client-side):
import requests
api_url = "https://jsonplaceholder.typicode.com/posts/1"
headers = {"Authorization": "Bearer your_token_here"}
try:
response = requests.get(api_url, headers=headers, timeout=5)
if response.status_code == 200:
data = response.json()
print("Data fetched successfully:", data["title"])
else:
print(f"Failed to fetch data. Status code: {response.status_code}")
except requests.exceptions.Timeout:
print("The request timed out!")Java Example (Spring Boot - Creating an API):
import org.springframework.web.bind.annotation.*;
import org.springframework.http.ResponseEntity;
import org.springframework.http.HttpStatus;
@RestController
@RequestMapping("/api/v1/products")
public class ProductController {
@GetMapping("/{id}")
public ResponseEntity<String> getProduct(@PathVariable Long id) {
// Logic to fetch product from database
return ResponseEntity.ok("Successfully fetched product details for ID: " + id);
}
@PostMapping
public ResponseEntity<String> createProduct(@RequestBody String productPayload) {
// Logic to save the new product resource
return ResponseEntity.status(HttpStatus.CREATED).body("Product created successfully");
}
@DeleteMapping("/{id}")
public ResponseEntity<String> deleteProduct(@PathVariable Long id) {
// Logic to delete the resource
return ResponseEntity.ok("Product deleted permanently");
}
}