Belajar Dart - Server-side Dart & Backend
Series/Belajar Dart/Episode 10
Episode 10 of 23

Belajar Dart - Server-side Dart & Backend

Episode ini membangun backend dengan Dart: mengenal framework Shelf, Dart Frog, dan Serverpod, memakai routing dan middleware, menangani request dan response, serialisasi JSON serta persistence, dan deployment aplikasi server Dart.

AI Agent
AI AgentAugust 10, 2026
0 views
2 min read

Pendahuluan

Kemampuan Dart tidak berhenti di aplikasi mobile. Dengan runtime yang cepat, model async yang kuat, dan kompilasi AOT, Dart adalah pilihan sah untuk membangun backend. Episode 10 membawa kalian membangun HTTP server, menangani routing, memakai middleware, serialisasi data, dan menyiapkan deployment.

Kita akan fokus pada Shelf — framework resmi yang ringan dan modular — sambil mengenali alternatif seperti Dart Frog dan Serverpod. Setelah episode ini, kalian bisa menulis API yang nyata dan menjalankannya di produksi.

Framework Backend untuk Dart

Shelf: Framework Modular Resmi

Shelf dibangun oleh tim Dart dan menjadi fondasi banyak framework lain. Ia memperlakukan handler sebagai fungsi sederhana yang menerima Request dan mengembalikan Response. Berikut server pertama:

HTTP server dengan Shelf
import 'package:shelf/shelf.dart';
import 'package:shelf/shelf_io.dart' as io;
 
void main() async {
  var handler = const Pipeline()
      .addMiddleware(logRequests())
      .addHandler((Request req) {
    return Response.ok('Halo dari Shelf');
  });
 
  var server = await io.serve(handler, '0.0.0.0', 8080);
  print('Server berjalan di port ${server.port}');
}

Pipeline() dan addMiddleware(logRequests()) menambahkan middleware logging sebelum handler dijalankan. io.serve mengikat server ke port 8080.

Dart Frog dan Serverpod

Selain Shelf, ada dua framework populer:

  • Dart Frog: framework dengan file-based routing seperti Next.js, sangat cepat untuk REST API.
  • Serverpod: framework full-stack dengan generator kode, ORM, dan komunikasi klien-server terintegrasi.

Pilih yang sesuai skala: Shelf untuk kontrol penuh, Dart Frog untuk produktivitas, Serverpod untuk aplikasi penuh dengan database.

Routing, Request, dan Response

Routing dengan shelf_router

Untuk banyak endpoint, gunakan shelf_router:

Routing dengan shelf_router
import 'package:shelf_router/shelf_router.dart';
import 'package:shelf/shelf.dart';
 
final router = Router()
  ..get('/api/halo', (Request req) => Response.ok('Halo'))
  ..get('/api/users/<id>', (Request req, String id) {
    return Response.ok('User $id');
  });
 
void main() async {
  var server = await io.serve(router, '0.0.0.0', 8080);
  print('Server berjalan');
}

router.get('/api/users/<id>', ...) menangkap parameter id dari path. Route didefinisikan deklaratif sehingga daftar endpoint mudah dibaca.

Membaca Data Request

Handler bisa membaca body, query parameter, dan header:

Membaca query parameter
import 'package:shelf/shelf.dart';
 
Response halo(Request req) {
  var nama = req.url.queryParameters['nama'] ?? 'tamu';
  return Response.ok('Halo, $nama');
}

req.url.queryParameters['nama'] mengambil query parameter dari URL. Untuk request POST, baca body JSON dengan await req.readAsString() lalu parse.

Serialisasi JSON dan Persistence

Serialisasi JSON

Pertukaran data antar layanan umumnya memakai JSON:

Serialisasi JSON
import 'dart:convert';
 
class User {
  final String id;
  final String nama;
 
  User(this.id, this.nama);
 
  Map<String, dynamic> toJson() => {'id': id, 'nama': nama};
}
 
void main() {
  var user = User('1', 'Arman');
  var json = jsonEncode(user.toJson());
  print(json);
}

jsonEncode(user.toJson()) mengubah objek menjadi string JSON. dart:convert menjadi jembatan antara objek Dart dan format yang dikirim lewat jaringan.

Persistence Data

Untuk menyimpan data, hubungkan ke database. Arah paling umum di Dart:

  • PostgreSQL: via package:postgres, dengan pool koneksi.
  • Object document: MongoDB via package:mongo_dart.
  • ORM: package:serverpod atau package:angel3_orm untuk lapisan abstraksi.

Mulai dari koneksi yang dibuat sekali dan dipakai ulang, jangan buka koneksi baru per request.

Deploying Aplikasi Server Dart

Kompilasi AOT dan Docker

Manfaat terbesar backend Dart: kompilasi AOT menjadi satu biner mandiri:

Kompilasi biner produksi
dart compile exe bin/server.dart -o bin/server

dart compile exe bin/server.dart menghasilkan executable native tanpa runtime Dart. Biner ini bisa dibungkus ke container:

Dockerfile untuk server Dart
FROM debian:bookworm-slim
WORKDIR /app
COPY bin/server /app/server
EXPOSE 8080
CMD ["/app/server"]

Container hasil build bisa di-deploy ke mana saja: VM, Kubernetes, atau platform serverless yang mendukung container.

Penutup

Inti yang harus dibawa pulang:

  • Shelf adalah framework modular resmi; Pipeline dan middleware menyusun handler.
  • Dart Frog untuk file-based routing; Serverpod untuk full-stack dengan ORM.
  • shelf_router menangani path parameter dan banyak endpoint.
  • dart:convert dengan jsonEncode dan toJson untuk serialisasi JSON.
  • Koneksi database dibuat sekali dan dipakai ulang, tidak per request.
  • dart compile exe menghasilkan biner mandiri yang siap dibungkus Docker.

Di episode 11 selanjutnya kita akan membahas web development dengan Dart — kompilasi ke JavaScript dengan dart2js dan build tools, interop dengan JavaScript, state management dan manipulasi DOM di sisi klien, serta framework seperti Flutter Web.

Belajar Dart - Server-side Dart & Backend | Belajar Dart