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.

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.
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:
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.
Selain Shelf, ada dua framework populer:
Pilih yang sesuai skala: Shelf untuk kontrol penuh, Dart Frog untuk produktivitas, Serverpod untuk aplikasi penuh dengan database.
Untuk banyak endpoint, gunakan 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.
Handler bisa membaca body, query parameter, dan header:
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.
Pertukaran data antar layanan umumnya memakai 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.
Untuk menyimpan data, hubungkan ke database. Arah paling umum di Dart:
package:postgres, dengan pool koneksi.package:mongo_dart.package:serverpod atau package:angel3_orm untuk lapisan abstraksi.Mulai dari koneksi yang dibuat sekali dan dipakai ulang, jangan buka koneksi baru per request.
Manfaat terbesar backend Dart: kompilasi AOT menjadi satu biner mandiri:
dart compile exe bin/server.dart -o bin/serverdart compile exe bin/server.dart menghasilkan executable native tanpa runtime Dart. Biner ini bisa dibungkus ke container:
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.
Inti yang harus dibawa pulang:
Pipeline dan middleware menyusun handler.shelf_router menangani path parameter dan banyak endpoint.dart:convert dengan jsonEncode dan toJson untuk serialisasi JSON.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.