BAB 1 — REST API

Cover

1 / 23
REST API FUNDAMENTAL
Modul Interaktif Mobile Development — menghubungkan aplikasi Flutter-mu dengan dunia internet melalui API.
KELAS 11 · SEMESTER 2 · BAB 1

Gunakan tombol ← → keyboard atau Prev/Next di bawah untuk berpindah slide.

BAB 1 — REST API

Peta Materi — Roadmap Bab 1

2 / 23
🗺️ Roadmap Pembelajaran

Inilah perjalanan kita di Bab 1. Klik node mana saja untuk lompat ke slide tersebut. Garis akan tergambar otomatis menunjukkan alur belajar dari konsep dasar hingga praktik kode.

API REST Client-Server HTTP Method Status Code Kode Flutter
📚 Yang Akan Kamu Pelajari
  • Apa itu API & untuk apa
  • REST, SOAP, GraphQL
  • Arsitektur Client-Server
  • 4 HTTP Method utama
  • 7 HTTP Status Code penting
  • Package http di Flutter
🎯 Tujuan Akhir

Setelah bab ini, kamu mampu memanggil API nyata dari aplikasi Flutter — mengambil data dari internet dan mengirim data ke server, lengkap dengan penanganan error.

Flutter API Server
BAB 1 — REST API

Apa Itu API?

3 / 23
💡 Konsep Utama

API = Application Programming Interface

API adalah perantara yang memungkinkan dua aplikasi berbicara satu sama lain. Aplikasi Flutter-mu tidak bisa langsung masuk ke database server — ia harus minta lewat API.

🌍 Analogi Kehidupan Nyata
📱
🧑‍🍳
🍳
Kamu (Flutter)
Dapur (Server)

Kamu di meja tidak masuk ke dapur. Pelayan (API) mengantar pesananmu ke dapur lalu membawakan makanannya. Itulah peran API!

📖 Penjelasan Detail

Bayangkan kamu lapar di restoran:

  • Kamu = aplikasi Flutter (client)
  • Pelayan = API (perantara)
  • Dapur = server & database

Kamu tidak perlu tahu cara memasak. Kamu cukup memberi pesanan ke pelayan, dan ia tahu harus ke mana.

👨‍💻 Kode Flutter / Dart
// Flutter "memesan" data ke API
final url = Uri.parse('https://api.toko.com/produk');
final response = await http.get(url);
// 'pelayan' (API) membawa balik datanya
print(response.body);
▶ Demo / Output
📤 REQUEST → GET /produk ⏳ API meneruskan ke dapur... 📥 RESPONSE ← 200 OK { "nama": "Kopi", "harga": 25000 }
BAB 1 — REST API

REST vs SOAP vs GraphQL

4 / 23
⚖️ Tabel Perbandingan
AspekRESTSOAPGraphQL
Format DataJSON (ringan)XML (berat)JSON
Kemudahan⭐⭐⭐⭐⭐ Mudah⭐⭐ Rumit⭐⭐⭐ Sedang
KecepatanCepatLambatCepat & hemat
Populer di Mobile✅ Sangat❌ Jarang✅ Naik daun
AnalogiMenu standarFormulir resmiMenu custom
📖 Penjelasan

Ketiganya adalah gaya komunikasi antara aplikasi dan server. Yang akan kita pakai sepanjang bab ini adalah REST, karena paling sederhana, ringan, dan paling banyak digunakan di dunia mobile.

▶ Kesimpulan Visual
REST ⭐ SOAP GraphQL

REST = pilihan utama untuk Flutter pemula.

BAB 1 — REST API

REST API — Konsep & Arsitektur

5 / 23
💡 Konsep Utama

REST = REpresentational State Transfer

REST adalah seperangkat aturan agar client & server berkomunikasi lewat HTTP. Setiap data disebut resource dan punya alamat (URL) sendiri, misal /produk/1.

🌍 Analogi — Panah Mengalir
CLIENT SERVER request → ← response
📖 6 Prinsip (Constraint) REST
  • Client-Server — terpisah jelas
  • Stateless — server tak ingat sesi lalu
  • Cacheable — data bisa disimpan sementara
  • Uniform Interface — aturan seragam
  • Layered System — berlapis
  • Code on Demand — opsional
👨‍💻 Contoh Resource
GET    /produk      // semua produk
GET    /produk/1    // produk id 1
POST   /produk      // tambah produk
PUT    /produk/1    // ubah produk 1
DELETE /produk/1    // hapus produk 1
▶ Demo / Output
GET /produk/1 200 OK { "id": 1, "nama": "Kopi Susu", "harga": 18000 }
BAB 1 — REST API

SOAP — Pengenalan

6 / 23
💡 Konsep Utama

SOAP = Simple Object Access Protocol

SOAP adalah protokol lama yang sangat ketat & formal. Semua pesan dibungkus dalam format XML dengan aturan baku. Aman, tapi berat dan rumit.

🌍 Analogi — Formulir Resmi
FORMULIR
RESMI
BERMETERAI

Seperti mengurus dokumen di kantor pemerintahan: harus pakai formulir resmi, stempel, dan format baku. Tidak boleh asal.

📖 Penjelasan

SOAP cocok untuk sistem perbankan & enterprise yang butuh keamanan tinggi. Tapi untuk aplikasi mobile sederhana, SOAP terasa terlalu kaku — itu sebabnya REST lebih populer.

👨‍💻 Contoh Pesan SOAP (XML)
<soap:Envelope>
  <soap:Body>
    <getProduk>
      <id>1</id>
    </getProduk>
  </soap:Body>
</soap:Envelope>
▶ Demo / Output
📤 Kirim envelope XML... 📋 Server validasi format baku 📥 Balasan: <Envelope> XML besar ⚠️ Ukuran 3x lebih besar dari JSON
BAB 1 — REST API

GraphQL — Pengenalan

7 / 23
💡 Konsep Utama

GraphQL = Query Language for API

GraphQL membiarkan client meminta persis data yang dibutuhkan — tidak lebih, tidak kurang. Satu permintaan bisa mengambil banyak data sekaligus.

🌍 Analogi — Menu Custom

Seperti memesan makanan custom: kamu sebut persis apa yang kamu mau dalam satu kali pesan.

📖 Penjelasan

Pada REST, kamu kadang dapat data berlebih. GraphQL menyelesaikan ini: client menulis query yang menyebut field yang diinginkan. Hemat data — cocok untuk koneksi internet lambat.

👨‍💻 Contoh Query GraphQL
query {
  produk(id: 1) {
    nama
    harga
  }
}
▶ Demo / Output
📤 Query: minta nama + harga saja 📥 Response (hanya yang diminta): { "nama":"Kopi", "harga":18000 } ✅ Tidak ada data berlebih!
BAB 1 — REST API

Arsitektur Client-Server

8 / 23
🔄 Flowchart Animasi — Titik Data Berjalan
CLIENT Flutter App API Perantara SERVER Database
📖 Penjelasan

Dunia API terbagi dua peran:

  • Client = yang meminta (Flutter)
  • Server = yang melayani & menyimpan data

Titik emas di atas adalah data yang berjalan bolak-balik antara mereka melalui API.

👨‍💻 Sisi Client (Flutter)
// CLIENT meminta ke SERVER
final res = await http.get(
  Uri.parse('https://server.com/data')
);
// SERVER membalas, CLIENT memproses
print(res.statusCode); // 200
▶ Demo Peran
📱 Client 🖥️ Server

Komunikasi dua arah lewat HTTP.

BAB 1 — REST API

Alur Data: Flutter → API → Database

9 / 23
🔄 Flowchart Vertikal Animasi
1. Flutter (UI) 2. http.get() 3. API Server 4. Database 5. JSON kembali ke UI
📖 Penjelasan Alur
  • 1. User tekan tombol di UI Flutter
  • 2. Flutter panggil http.get()
  • 3. Request sampai ke API server
  • 4. Server ambil data dari database
  • 5. Data dikirim balik sebagai JSON, lalu ditampilkan

Titik emas = perjalanan data dari atas ke bawah lalu kembali.

👨‍💻 Alur dalam Kode
// 1-2. Flutter memanggil API
final res = await http.get(Uri.parse('https://api.com/produk'));
// 3-4. Server & database bekerja di balik layar...
// 5. Data JSON kembali & diubah jadi objek Dart
final data = jsonDecode(res.body);
setState(() => daftarProduk = data); // tampilkan ke UI
BAB 1 — REST API

HTTP Method: GET

10 / 23
💡 Konsep Utama
GET

Mengambil / Membaca Data

GET dipakai untuk meminta data dari server tanpa mengubah apa pun. Ini method paling sering digunakan.

🌍 Analogi — Baca Menu
📱 Kamu 📖 Lihat Menu

Membaca menu tidak mengubah isi dapur. GET hanya "melihat" data — aman & tidak merusak.

📖 Penjelasan

GET bersifat read-only dan idempotent — dipanggil berapa kali pun hasilnya sama dan tak ada efek samping. Data dikirim lewat URL, bukan body.

👨‍💻 Kode Flutter / Dart
final url = Uri.parse('https://api.com/menu');
final response = await http.get(url);

if (response.statusCode == 200) {
  print(response.body); // daftar menu
}
▶ Demo / Output
GET /menu 200 OK [ {"nama":"Kopi"}, {"nama":"Teh"} ]
BAB 1 — REST API

HTTP Method: POST

11 / 23
💡 Konsep Utama
POST

Mengirim / Membuat Data Baru

POST dipakai untuk mengirim data baru ke server, misal mendaftar akun atau menambah produk.

🌍 Analogi — Pesan Makanan
📝 Pesanan 🍳 Dapur

Memesan makanan = membuat data baru di dapur. Server kini punya pesanan yang sebelumnya tidak ada.

📖 Penjelasan

POST membawa data di body request (biasanya JSON). Berbeda dari GET, POST mengubah keadaan server — membuat record baru. Balasannya umumnya 201 Created.

👨‍💻 Kode Flutter / Dart
final response = await http.post(
  Uri.parse('https://api.com/pesan'),
  headers: {'Content-Type': 'application/json'},
  body: jsonEncode({'menu': 'Kopi', 'jumlah': 2}),
);
▶ Demo / Output
POST /pesan {"menu":"Kopi"} 201 Created { "id": 99, "status": "diterima" }
BAB 1 — REST API

HTTP Method: PUT

12 / 23
💡 Konsep Utama
PUT

Mengubah / Memperbarui Data

PUT dipakai untuk memperbarui data yang sudah ada di server, misal mengganti isi pesanan.

🌍 Analogi — Ganti Pesanan
☕ Kopi (lama)
🍵 Teh (baru)

"Pak, ganti kopi saya jadi teh." Pesanan lama ditimpa pesanan baru — itulah PUT.

📖 Penjelasan

PUT menggantikan seluruh data pada resource tertentu. Kamu harus menyebut id data yang mau diubah di URL, lalu kirim data baru di body.

👨‍💻 Kode Flutter / Dart
final response = await http.put(
  Uri.parse('https://api.com/pesan/99'),
  headers: {'Content-Type': 'application/json'},
  body: jsonEncode({'menu': 'Teh', 'jumlah': 1}),
);
▶ Demo / Output
PUT /pesan/99 {"menu":"Teh"} 200 OK { "id":99, "menu":"Teh" }
BAB 1 — REST API

HTTP Method: DELETE

13 / 23
💡 Konsep Utama
DELETE

Menghapus Data

DELETE dipakai untuk menghapus data dari server berdasarkan id-nya.

🌍 Analogi — Batalkan Pesanan
🗑️ Pesanan dibatalkan

"Pak, batalkan pesanan saya." Data pesanan dihapus dari sistem — itulah DELETE.

📖 Penjelasan

DELETE menghapus resource yang ditunjuk oleh id di URL. Setelah dihapus, data tidak bisa diambil lagi. Balasan umum: 200 OK atau 204 No Content.

👨‍💻 Kode Flutter / Dart
final response = await http.delete(
  Uri.parse('https://api.com/pesan/99'),
);

if (response.statusCode == 200) {
  print('Pesanan berhasil dibatalkan');
}
▶ Demo / Output
DELETE /pesan/99 200 OK { "status": "dihapus" }
BAB 1 — REST API

Status Code 2xx — Sukses

14 / 23
✅ Animasi Sukses

Centang hijau = permintaan berhasil!

💡 Konsep
200 OK
201 Created

Kode 2xx berarti permintaan berhasil. Server menerima & memproses dengan baik.

📖 Penjelasan
  • 200 OK — berhasil (GET, PUT, DELETE)
  • 201 Created — data baru berhasil dibuat (POST)

Selalu cek response.statusCode sebelum memproses data.

👨‍💻 Kode
if (response.statusCode == 200) {
  print('Berhasil ambil data!');
} else if (response.statusCode == 201) {
  print('Data baru tersimpan!');
}
▶ Demo
✓ 200 OK — data berhasil diambil ✓ 201 Created — data baru dibuat
BAB 1 — REST API

Status Code 4xx — Kesalahan Client

15 / 23
⚠️ Animasi Peringatan
400 Bad Request
401 Unauthorized
403 Forbidden
404 Not Found
📖 Penjelasan

Kode 4xx = kesalahan dari pihak client (kamu). Permintaanmu salah atau tidak diizinkan.

  • 400 — format permintaan salah
  • 401 — belum login / token salah
  • 403 — login tapi tak punya izin
  • 404 — alamat/data tidak ditemukan
🌍 Analogi
  • 401 = belum punya tiket masuk
  • 403 = punya tiket tapi area VIP terlarang
  • 404 = mencari toko yang sudah tutup
👨‍💻 Kode
if (response.statusCode == 404) {
  print('Data tidak ditemukan');
} else if (response.statusCode == 401) {
  print('Silakan login dulu');
}
BAB 1 — REST API

Status Code 5xx — Kesalahan Server

16 / 23
💥 Animasi Server Shake
🖥️
500 Internal Server Error
📖 Penjelasan

Kode 5xx = kesalahan di pihak server, bukan kamu. Server sedang bermasalah atau crash.

  • 500 — server error internal
  • 502 — bad gateway
  • 503 — server sibuk / maintenance
🌍 Analogi

Seperti dapur restoran yang kebakaran 🔥 — pesananmu sudah benar, tapi dapur tidak bisa memasak. Bukan salahmu, salah dapur (server).

👨‍💻 Kode
if (response.statusCode >= 500) {
  print('Server sedang bermasalah, coba lagi nanti');
}
▶ Demo
GET /produk ✗ 500 Internal Server Error Server crash — bukan salah client
BAB 1 — REST API

Setup Package HTTP Flutter

17 / 23
💡 Konsep Utama

Package http

Flutter tidak bisa memanggil API tanpa alat. Kita pakai package resmi bernama http yang harus didaftarkan dulu di pubspec.yaml.

⌨️ Terminal — Typing Effect
~/project $ pubspec.yaml
flutter pub add http

Jalankan perintah ini di terminal untuk menambah package secara otomatis.

👨‍💻 pubspec.yaml
dependencies:
  flutter:
    sdk: flutter
  http: ^1.2.0   # package untuk API
👨‍💻 Import di Dart
import 'package:http/http.dart' as http;
import 'dart:convert'; // untuk jsonEncode/jsonDecode
▶ Demo / Output
$ flutter pub add http ✓ Resolving dependencies... ✓ http 1.2.0 berhasil ditambahkan ✓ Siap dipakai!
BAB 1 — REST API

Implementasi http.get()

18 / 23
👨‍💻 Kode Lengkap — GET dengan Try-Catch
import 'package:http/http.dart' as http;
import 'dart:convert';

Future<void> fetchData() async {
  try {
    final url = Uri.parse('https://jsonplaceholder.typicode.com/posts/1');
    final response = await http.get(url);

    if (response.statusCode == 200) {
      final data = jsonDecode(response.body);
      print('Judul: ${data['title']}');
    } else {
      print('Error: ${response.statusCode}');
    }
  } catch (e) {
    print('Gagal koneksi: $e');
  }
}
📖 Penjelasan
  • try-catch menangkap error koneksi
  • await menunggu balasan server
  • jsonDecode ubah teks JSON jadi objek Dart
  • Selalu cek statusCode dulu
🌍 Animasi Request → Response
📱 get() 🌐 Server 📥 JSON
▶ Demo / Output JSON
GET /posts/1 200 OK { "userId": 1, "id": 1, "title": "sunt aut facere..." } ▶ print → Judul: sunt aut facere...
BAB 1 — REST API

Implementasi http.post()

19 / 23
👨‍💻 Kode Lengkap — POST dengan Body JSON
import 'package:http/http.dart' as http;
import 'dart:convert';

Future<void> sendData(String title, String body) async {
  try {
    final url = Uri.parse('https://jsonplaceholder.typicode.com/posts');
    final response = await http.post(
      url,
      headers: {'Content-Type': 'application/json'},
      body: jsonEncode({'title': title, 'body': body, 'userId': 1}),
    );

    if (response.statusCode == 201) {
      final result = jsonDecode(response.body);
      print('Data berhasil dikirim! ID: ${result['id']}');
    } else {
      print('Gagal: ${response.statusCode}');
    }
  } catch (e) {
    print('Error: $e');
  }
}
📖 Penjelasan
  • headers beri tahu server data berformat JSON
  • jsonEncode ubah Map Dart jadi teks JSON
  • Sukses POST = 201 Created
  • Body berisi data yang dikirim ke server
🌍 Animasi Encode → Travel → Response
📝 encode 🌐 Server ✅ 201
▶ Demo / Output
POST /posts {"title":"Halo"} 201 Created { "id": 101, "title": "Halo" } ▶ print → Data dikirim! ID: 101
BAB 1 — REST API

Rangkuman — Mind Map Interaktif

20 / 23
🧠 Klik node untuk membuka detail
REST API
API
Perantara client & server
REST/SOAP/GraphQL
Gaya komunikasi data
Client-Server
Peminta & pelayan
GET
Membaca data
POST
Membuat data baru
PUT
Mengubah data
DELETE
Menghapus data
2xx / 4xx / 5xx
Status sukses & error
Package http
http.get() & http.post()
📋 Poin Kunci Bab 1
  • API = perantara antara aplikasi dan server
  • REST = gaya API paling populer (JSON, ringan)
  • 4 Method: GET (baca), POST (buat), PUT (ubah), DELETE (hapus)
  • Status Code: 2xx sukses, 4xx salah client, 5xx salah server
  • Flutter pakai package http + jsonDecode/Encode
BAB 1 — LATIHAN 1

Quiz — HTTP Method

21 / 23
📝 Pilih jawaban yang benar
Skor: 0 / 4
BAB 1 — LATIHAN 2

Matching — Status Code

22 / 23
🔗 Klik kode di kiri, lalu pasangkan ke arti di kanan
Cocok: 0 / 5
BAB 1 — TUGAS AKHIR

Tugas — Implementasi API Call

23 / 23
🎯 Instruksi Tugas

Buatlah aplikasi Flutter sederhana yang mengambil daftar postingan dari API publik dan menampilkannya di layar.

API: https://jsonplaceholder.typicode.com/posts

✅ Checklist Requirement
Tambahkan package http di pubspec.yaml
Buat fungsi fetchPosts() dengan http.get()
Gunakan try-catch untuk menangani error
Cek statusCode == 200 sebelum proses
Tampilkan judul tiap post di ListView
Tambahkan tombol POST untuk kirim data baru
👨‍💻 Kerangka Kode Awal
Future<List> fetchPosts() async {
  final url = Uri.parse('https://jsonplaceholder.typicode.com/posts');
  final res = await http.get(url);
  if (res.statusCode == 200) {
    return jsonDecode(res.body);
  }
  throw Exception('Gagal memuat data');
}
📝 Catatan & Rencanamu

Selamat mengerjakan! Kamu sudah menguasai dasar REST API. 🚀