> For the complete documentation index, see [llms.txt](https://mominur.gitbook.io/mominur-notes/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://mominur.gitbook.io/mominur-notes/system-design/api/rest-api.md).

# REST API

### REST API মানে কি?

ধরো তুমি একটি মোবাইল অ্যাপ বানিয়েছো, এখন অ্যাপটাকে সার্ভার থেকে ডেটা নিতে হবে — যেমন ইউজারের তথ্য, পোস্ট, প্রোডাক্ট ইত্যাদি। ঠিক এই ডেটা আদান-প্রদানের মাধ্যমটাই হলো **REST API**।

**REST API** হচ্ছে এমন একটা পদ্ধতি (architecture style), যার মাধ্যমে ক্লায়েন্ট (যেমনঃ ব্রাউজার, অ্যাপ) এবং সার্ভার একে অপরের সঙ্গে **HTTP** এর মাধ্যমে সহজভাবে কথা বলে — ঠিক যেমন তুমি কারো সাথে ফোনে কথা বলো!

***

### REST এর Principles

১. **Stateless**

* প্রতিটি রিকোয়েস্টে সব দরকারি তথ্য থাকবে।
* সার্ভার কোনো session ধরে রাখবে না।

২. **Client-Server Architecture**

* UI আর ডেটার কাজ আলাদা হবে।

৩. **Cacheable**

* রেসপন্সগুলো cache করা যাবে পারফরম্যান্স বাড়ানোর জন্য।

৪. **Uniform Interface**

* একই রকম রুলে সবকিছু চলবে, যেমন HTTP Methods: GET, POST ইত্যাদি।

৫. **Layered System**

* ক্লায়েন্ট ও সার্ভারের মাঝে middle layer (proxy, load balancer) থাকতে পারে।

৬. **Code on Demand (Optional)**

* চাইলে সার্ভার থেকে কোড পাঠানো যায় ক্লায়েন্টে রান করার জন্য।

***

### REST API এর Components

#### Resources

প্রত্যেকটা জিনিস (যেমন user, product, post) হলো একটা **resource**। প্রতিটি resource এর নিজস্ব একটা **URI (Uniform Resource Identifier)** থাকে।

উদাহরণ:\
`https://api.example.com/users/123` → ইউজার আইডি 123

***

### HTTP Methods

| HTTP Method | কাজ (Operation) | ব্যাখ্যা              |
| ----------- | --------------- | --------------------- |
| GET         | Read            | রিসোর্স পড়ে আনা       |
| POST        | Create          | নতুন রিসোর্স তৈরি করা |
| PUT         | Update          | সম্পূর্ণ আপডেট করা    |
| PATCH       | Partial Update  | আংশিক আপডেট করা       |
| DELETE      | Delete          | রিসোর্স মুছে ফেলা     |

***

### REST API URL Naming Standard

#### নিয়মকানুন

১. **Nouns ব্যবহার করো, Verbs নয়**

* ❌ `/getUser`
* ✅ `/users`

২. **Plural nouns ব্যবহার করো**

* ❌ `/user/123`
* ✅ `/users/123`

৩. **সবসময় lowercase**

* ❌ `/Users/John`
* ✅ `/users/john`

৪. **Hyphen ব্যবহার করো multi-word এর জন্য**

* ✅ `/user-profile`

৫. **Nested রিসোর্স দেখাতে `/parent/child` ফরম্যাট**

* `/posts/123/comments`

৬. **Filtering, Sorting, Pagination এ query params**

* `/products?category=mobile&sort=price_desc&page=2`

***

#### কিছু নমুনা URL

| উদ্দেশ্য           | URL উদাহরণ             | মন্তব্য             |
| ------------------ | ---------------------- | ------------------- |
| সব ইউজার দেখা      | `GET /users`           | collection          |
| নির্দিষ্ট ইউজার    | `GET /users/123`       | individual resource |
| ইউজার তৈরি করা     | `POST /users`          | request body দিয়ে   |
| ইউজার আপডেট করা    | `PUT /users/123`       | সম্পূর্ণ আপডেট      |
| ইউজার ডিলিট করা    | `DELETE /users/123`    |                     |
| ইউজারের পোস্ট দেখা | `GET /users/123/posts` | sub-resource        |

***

### একটি বাস্তব উদাহরণ (Blog API)

#### Base URL:

```
https://api.example.com/posts
```

#### Endpoint উদাহরণ:

| কাজ                  | HTTP Method | Endpoint     |
| -------------------- | ----------- | ------------ |
| সব পোস্ট দেখা        | GET         | `/posts`     |
| নির্দিষ্ট পোস্ট দেখা | GET         | `/posts/101` |
| পোস্ট তৈরি করা       | POST        | `/posts`     |
| পোস্ট আপডেট করা      | PUT         | `/posts/101` |
| পোস্ট ডিলিট করা      | DELETE      | `/posts/101` |

#### JSON রেসপন্স:

```json
{
  "id": 101,
  "title": "REST API Introduction",
  "content": "This post explains REST...",
  "author": "John Doe",
  "created_at": "2025-04-18T12:30:00Z"
}
```

***

### REST API Design Best Practices

* **HTTP Status Code** সঠিকভাবে ব্যবহার করো
  * `200 OK`, `201 Created`, `404 Not Found`, `500 Internal Server Error` ইত্যাদি
* **Versioning** করো
  * `/api/v1/users`
* **Pagination & Filtering** করো
  * `/posts?page=2&limit=10`
* **Error Handling** standard ফরম্যাটে দাও
  * JSON format: `{ "error": "User not found" }`

***

### Authentication পদ্ধতি

* **API Key** – সহজ, কিন্তু কম secure
* **OAuth 2.0** – industry standard
* **JWT (JSON Web Token)** – সবচেয়ে জনপ্রিয়, stateless

***

### REST কি না?

* REST হলো একধরনের structure, protocol না
* REST ≠ SOAP (SOAP বেশি rigid আর XML নির্ভর)
* REST JSON ফলো করে, তবে XML ও পাঠানো যায়

***

### REST API এর সুবিধা

* সহজ ও clean
* Stateless হওয়ায় scalable
* HTTP-এর built-in ক্ষমতা ব্যবহার করে
* বিভিন্ন প্ল্যাটফর্মে কাজ করে
* Lightweight এবং cacheable

***

### REST এর কিছু সীমাবদ্ধতা

* একাধিক কাজ একসাথে করতে অসুবিধা হয়
* কোনো built-in schema নেই (SOAP এর মত WSDL না)
* Versioning manual করতে হয়

***

REST API এমন একটি প্রযুক্তি যা আজকের প্রায় সব ওয়েব, মোবাইল এবং ক্লাউড অ্যাপে ব্যবহৃত হচ্ছে। এর সহজতা, স্কেলেবিলিটি, এবং স্ট্যান্ডার্ড পদ্ধতির কারণে এটা এখনো অনেক জনপ্রিয়, যদিও **GraphQL** এর মতো নতুন প্রযুক্তিও আসছে। REST API জানা মানেই আধুনিক ওয়েব ডেভেলপমেন্টের মূলভিত্তি আয়ত্তে আনা।
