Membangun aplikasi FastAPI pertama: menginstall fastapi dan uvicorn, menulis endpoint / dan /health, menjalankan uvicorn main:app --reload, lalu menjelajahi dokumentasi interaktif Swagger di /docs dan ReDoc di /redoc.

Setelah di episode 2 kita memahami arsitektur — path operation, alur validasi Pydantic, dan peran uvicorn sebagai server ASGI — sekarang saatnya menjalankan kode pertama. Di episode ini kita akan menginstall FastAPI dan uvicorn, menulis aplikasi minimal, lalu menjelajahi fitur yang paling menonjol: dokumentasi interaktif yang muncul otomatis.
Mengapa episode ini penting? Karena "Hello World" di FastAPI bukan sekadar menampilkan teks — ia memperlihatkan tiga hal sekaligus yang akan menyertai kalian di seluruh series: server dengan hot-reload, validasi otomatis, dan auto-docs. Kalau tiga hal ini terasa natural, separuh perjalanan sudah terbayar.
Pastikan virtual environment aktif (episode 0), lalu install:
pip install "fastapi>=0.141,<0.142" "uvicorn[standard]>=0.30"uvicorn[standard] penting karena menambahkan httptools (parser HTTP lebih cepat), uvloop (event loop native), dan dukungan WebSocket — semua dipakai di episode-episode lanjutan.
Buat file main.py di folder lab:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root() -> dict[str, str]:
return {"message": "Halo Dunia FastAPI"}Perhatikan tiga hal:
app = FastAPI() membuat instance aplikasi — satu-satunya objek yang dikenal uvicorn.@app.get("/") mendaftarkan path operation GET /.dict langsung dikonversi JSON oleh FastAPI.Jalankan server:
uvicorn main:app --reloadmain:app berarti: ambil file main.py, cari objek bernama app. Flag --reload mengaktifkan hot-reload — setiap perubahan file memicu restart otomatis, sangat nyaman saat pengembangan.
Tip
--reload hanya untuk development. Di produksi (episode 24) kita justru menonaktifkannya dan mengandalkan multi-worker uvicorn/gunicorn, karena hot-reload memakan resource dan bisa menurunkan throughput.
Dari terminal kedua, uji endpoint-nya:
curl -s http://127.0.0.1:8000/Output:
{"message":"Halo Dunia FastAPI"}FastAPI mengubah dict Python menjadi JSON dengan header content-type: application/json secara otomatis.
Ini fitur pembeda FastAPI. Buka browser:
http://127.0.0.1:8000/docs — antarmuka interaktif untuk mengeksekusi endpoint langsung dari browser.http://127.0.0.1:8000/redoc — dokumentasi dua panel yang lebih cocok untuk dibaca.Kedua halaman itu bukan template hardcoded — keduanya dirender dari schema OpenAPI yang dihasilkan FastAPI secara otomatis dari kode kalian. Bisa dilihat mentahnya di:
curl -s http://127.0.0.1:8000/openapi.json | python -m json.tool | head -30Schema inilah yang dipakai banyak tool untuk auto-generate client, validasi request, dan dokumentasi — topik yang kita dalami di episode 21.
Mari perlihatkan kekuatan auto-docs: tambahkan endpoint yang membutuhkan input. Ubah main.py:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root() -> dict[str, str]:
return {"message": "Halo Dunia FastAPI"}
@app.get("/items/{item_id}")
def read_item(item_id: int) -> dict[str, int | str]:
return {"item_id": item_id}Perhatikan item_id: int. Karena kita menandai tipe sebagai int, FastAPI otomatis:
/items/abc ditolak dengan HTTP 422./items/42 masuk ke fungsi sebagai 42 (int), bukan string.Uji validasinya:
curl -i -s http://127.0.0.1:8000/items/42
curl -i -s http://127.0.0.1:8000/items/abcBuka lagi /docs — kalian akan melihat endpoint baru sudah muncul, lengkap dengan parameter dan tipe data. Tidak ada satu baris dokumentasi pun yang ditulis manual.
Note
Status 422 Unprocessable Entity adalah "sidik jari" FastAPI: itu bukan error server, melainkan indikasi bahwa input tidak sesuai tipe yang dideklarasikan. Di episode 5 dan 17 kita akan mengkustomisasi detail error-nya.
| Pitfall | Gejala | Solusi |
|---|---|---|
| Menjalankan uvicorn di luar environment | ModuleNotFoundError: No module named 'fastapi' | Aktifkan .venv dulu |
| Nama file atau objek salah | Could not import module 'main' | Pastikan nama cocok: uvicorn main:app |
Lupa --reload | Perubahan tidak muncul | Tambahkan --reload saat development |
| Port sudah dipakai | [Errno 98] Address already in use | Ganti port: uvicorn main:app --port 8001 |
Inti yang harus dibawa pulang:
fastapi dan uvicorn[standard]; jalankan dengan uvicorn main:app --reload.dict otomatis jadi JSON./docs (Swagger) dan /redoc dirender dari schema OpenAPI yang dihasilkan dari type hints.Di episode 4 selanjutnya kita akan membahas routing & path parameters secara lengkap — semua HTTP methods (GET/POST/PUT/DELETE), path params dengan validasi tipe, query params, hingga aturan urutan parameter yang sering menjebak pemula. Pastikan uvicorn --reload tetap berjalan, karena kita akan menulis banyak endpoint baru!