1. Prinsip-prinsip REST
REST (Representational State Transfer) adalah arsitektur software yang diperkenalkan oleh Roy Fielding dalam disertasinya tahun 2000. REST bukan standar, melainkan sekumpulan prinsip desain yang digunakan untuk membangun web services yang scalable, maintainable, dan interoperable.
API yang mengikuti prinsip REST disebut RESTful API. Mayoritas API publik saat ini — termasuk Twitter, GitHub, Google Maps, dan Stripe — menggunakan arsitektur REST karena kesederhanaan dan skalabilitasnya.
6 Prinsip Utama REST
| Prinsip | Penjelasan | Contoh Implementasi |
|---|---|---|
| Client-Server | Client dan server terpisah — masing-masing bisa berkembang secara independen | Frontend React terpisah dari backend Node.js |
| Stateless | Setiap request harus berisi semua informasi yang dibutuhkan server — tidak ada session state | Token JWT dikirim di setiap request header |
| Cacheable | Response harus menyatakan apakah data bisa di-cache atau tidak | Header Cache-Control, ETag |
| Uniform Interface | Antarmuka yang konsisten menggunakan URL dan HTTP methods standar | GET /users, POST /users |
| Layered System | Client tidak perlu tahu apakah berbicara langsung dengan server atau melalui proxy/CDN | API Gateway, load balancer, CDN |
| Code on Demand (opsional) | Server bisa mengirim executable code ke client | JavaScript di response (jarang digunakan) |
REST bukan satu-satunya pilihan untuk API. GraphQL cocok untuk data yang kompleks dan butuh query fleksibel. gRPC cocok untuk komunikasi antar-microservice berperforma tinggi. Namun, REST tetap pilihan terbaik untuk sebagian besar kasus karena kesederhanaan, dokumentasi luas, dan kompatibilitas universal.
2. HTTP Methods
HTTP methods (juga disebut HTTP verbs) mendefinisikan operasi apa yang ingin dilakukan client terhadap resource. Dalam REST API, setiap operasi CRUD dipetakan ke HTTP method yang sesuai.
Mapping HTTP Methods ke Operasi CRUD
| HTTP Method | Operasi | URL Contoh | Berhasil | Aman? | Idempoten? |
|---|---|---|---|---|---|
GET | Read (ambil data) | GET /api/users | 200 OK | ✅ Ya | ✅ Ya |
POST | Create (buat baru) | POST /api/users | 201 Created | ❌ Tidak | ❌ Tidak |
PUT | Update (ganti seluruh) | PUT /api/users/1 | 200 OK | ❌ Tidak | ✅ Ya |
PATCH | Update (sebagian) | PATCH /api/users/1 | 200 OK | ❌ Tidak | ❌ Tidak |
DELETE | Delete (hapus) | DELETE /api/users/1 | 204 No Content | ❌ Tidak | ✅ Ya |
HEAD | Seperti GET tanpa body | HEAD /api/users | 200 OK | ✅ Ya | ✅ Ya |
OPTIONS | Info methods yang tersedia | OPTIONS /api/users | 200 OK | ✅ Ya | ✅ Ya |
- Aman (Safe): Method tidak mengubah data di server — hanya membaca.
- Idempoten: Memanggil method yang sama berkali-kali menghasilkan hasil yang sama. Misalnya
DELETE /users/1— meskipun dipanggil 5 kali, hasilnya tetap: user 1 terhapus. - POST tidak idempoten: Memanggil
POST /usersberkali-kali akan membuat banyak user baru.
Contoh Penggunaan
flowchart TD
N0["Resource Collection"]
N1["GET /api/v1/users No. Ambil sem..."]
N2["POST /api/v1/users No. Buat user..."]
N3["Single Resource"]
N4["GET /api/v1/users/42 No. Ambil use..."]
N5["PUT /api/v1/users/42 No. Update us..."]
N6["PATCH /api/v1/users/42 No. Update us..."]
N7["DELETE /api/v1/users/42 No. Hapus use..."]
N8["Nested Resources (relasi)"]
N9["GET /api/v1/users/42/orders No. Semua ord..."]
N10["POST /api/v1/users/42/orders No. Buat orde..."]
N11["GET /api/v1/users/42/orders/7 No. Order 7 m..."]
N12["Sub-resource Operations"]
N13["POST /api/v1/articles/5/comments No. Tamba..."]
N14["GET /api/v1/articles/5/comments No. Ambil..."]
N15["Actions (ketika CRUD tidak cukup)"]
N16["POST /api/v1/users/42/activate No. Aktifk..."]
N17["POST /api/v1/orders/7/cancel No. Batalk..."]
N18["POST /api/v1/articles/5/publish No. Publik..."]
N19["Search dan Filter"]
N20["GET /api/v1/articles?category=teknologidanso..."]
N21["GET /api/v1/users?search=budidanrole=adminda..."]
N22["WRONG: Contoh URL yang buruk"]
N23["menggunakan verb"]
N24["singular"]
N25["prefix tidak perlu"]
N26["verb di URL"]
N27["PascalCase"]
N0 --> N1
N1 --> N2
N2 --> N3
N3 --> N4
N4 --> N5
N5 --> N6
N6 --> N7
N7 --> N8
N8 --> N9
N9 --> N10
N10 --> N11
N11 --> N12
N12 --> N13
N13 --> N14
N14 --> N15
N15 --> N16
N16 --> N17
N17 --> N18
N18 --> N19
N19 --> N20
N20 --> N21
N21 --> N22
N22 --> N23
N23 --> N24
N24 --> N25
N25 --> N26
N26 --> N27