FastAPI adalah framework Python modern untuk membangun API dengan cepat menggunakan type hints, validasi, dan dokumentasi OpenAPI otomatis. Pelajari dasar dan penggunaannya.

FastAPI adalah framework Python untuk membangun web API dengan cepat, kode yang jelas, dan dokumentasi otomatis. Anda menulis fungsi kecil (disebut “endpoint”) yang menyatakan data apa yang API Anda terima dan apa yang dikembalikan, dan FastAPI mengurus bagian web—routing, validasi, dan pembuatan respons JSON.
API adalah sekumpulan URL yang memungkinkan satu perangkat lunak berkomunikasi dengan perangkat lunak lain.
Misalnya, aplikasi cuaca di ponsel Anda mungkin memanggil URL seperti GET /weather?city=Berlin. Server menjawab dengan data terstruktur (biasanya JSON), seperti suhu dan prakiraan. Aplikasi ponsel tidak perlu akses langsung ke database server—ia cukup meminta API dan menampilkan hasilnya.
FastAPI membantu Anda membuat URL dan respons itu dalam Python.
Anda tidak perlu ahli async untuk memulai; Anda bisa menulis endpoint sederhana dan mengadopsi pola yang lebih maju seiring perkembangan.
FastAPI cepat populer karena menghilangkan banyak gesekan sehari-hari yang ditemui orang saat membangun API di Python.
Proyek API tradisional sering dimulai dengan setup yang lambat dan banyak “plumbing”:
Fitur inti FastAPI menargetkan masalah-masalah ini secara langsung, sehingga tim menghabiskan lebih banyak waktu mendesain endpoint dan lebih sedikit waktu melawan boilerplate framework.
FastAPI sangat memanfaatkan type hints Python. Saat Anda menyatakan bahwa sebuah field adalah int, opsional, atau list dari sesuatu, FastAPI memakai informasi itu untuk memvalidasi input dan membentuk output.
Ini mengurangi kesalahan “stringly-typed” (mis. memperlakukan ID sebagai teks di satu tempat dan angka di tempat lain) dan mendorong perilaku endpoint yang konsisten. Ini tetap Python, tetapi dengan ekspektasi yang lebih jelas tercantum di tanda tangan fungsi.
Karena skema API diturunkan dari kode, FastAPI dapat menghasilkan dokumentasi interaktif otomatis (OpenAPI + Swagger UI/ReDoc). Itu penting untuk kolaborasi: front-end developers, QA, dan integrator dapat menjelajahi endpoint, mencoba request, dan melihat model tepat tanpa menunggu upaya dokumentasi terpisah.
FastAPI tidak akan memperbaiki desain API yang buruk. Anda tetap membutuhkan penamaan yang baik, versioning, penanganan error, dan keputusan keamanan. Yang ditawarkan adalah jalur yang lebih bersih dari “ide” ke “API yang terdefinisi dengan baik” dengan lebih sedikit kejutan di sepanjang jalan.
FastAPI terasa mudah setelah Anda memahami beberapa ide inti yang menjadi dasar. Anda tidak perlu menghafal detail internal—cukup kenali bagian-bagian yang akan Anda gunakan sehari-hari.
Sebuah framework adalah kumpulan alat dan konvensi untuk membangun API tanpa memulai dari nol. FastAPI menyediakan “plumbing” untuk tugas API umum: mendefinisikan endpoint, membaca input, mengembalikan output, menangani error, dan mengorganisir kode menjadi struktur yang mudah dipelihara.
Routing adalah bagaimana Anda memetakan URL dan metode HTTP ke potongan kode Python.
Misalnya, Anda mungkin merutekan GET /users ke “list users” dan POST /users ke “create a user.” Di FastAPI, Anda biasanya mendefinisikan route dengan dekorator seperti @app.get(...) dan @app.post(...), yang memudahkan untuk melihat apa yang ditawarkan API Anda sekilas.
Setiap panggilan API adalah sebuah request (apa yang dikirim klien) dan sebuah response (apa yang dikembalikan server Anda).
FastAPI membantu Anda:
/users/{id}), query string (?page=2), header, dan body request200, 201, 404)FastAPI berjalan di ASGI, standar modern untuk server web Python. Secara praktis, ini berarti FastAPI dirancang untuk menangani banyak koneksi secara efisien, dan dapat mendukung fitur seperti koneksi jangka panjang (mis. WebSockets) saat Anda membutuhkannya—tanpa harus mengelola jaringan tingkat rendah sendiri.
Type hints Python (seperti str, int, list[Item]) bukan hanya dokumentasi di FastAPI—mereka adalah input penting. FastAPI menggunakannya untuk memahami data yang Anda harapkan, mengonversi nilai masuk ke tipe yang tepat, dan menghasilkan API yang lebih jelas dan dapat diprediksi.
Model Pydantic memungkinkan Anda mendefinisikan bentuk data (field, tipe, nilai opsional) di satu tempat. FastAPI menggunakan model ini untuk memvalidasi JSON masuk, menolak input yang tidak valid dengan pesan error yang membantu, dan melakukan serialisasi output secara konsisten—sehingga API Anda berperilaku andal bahkan ketika klien mengirim data berantakan.
Aplikasi FastAPI dibangun di sekitar endpoint: path URL plus metode HTTP. Anggap endpoint sebagai “apa yang diminta klien” dan “bagaimana mereka memintanya.” Misalnya, klien mungkin GET /users untuk daftar pengguna, atau POST /users untuk membuat satu.
Sebuah path adalah route, dan method adalah aksi:
GET /products → mengambil dataPOST /products → mengirim data untuk membuat sesuatuPUT /products/123 → mengganti/memperbarui sesuatuDELETE /products/123 → menghapus sesuatuFastAPI memisahkan data yang bagian dari path dari data yang biasanya berupa filter opsional pada request.
GET /users/42 → 42 adalah user ID.? dan biasanya opsional.
GET /users?limit=10&active=true → limit dan active mengontrol bagaimana hasil dikembalikan.Ketika klien mengirim data terstruktur (biasanya JSON), itu masuk ke request body, sering dengan POST atau PUT.
Contoh: POST /orders dengan JSON seperti { "item_id": 3, "quantity": 2 }.
FastAPI bisa mengembalikan objek Python biasa (seperti dict), tetapi keunggulannya muncul saat Anda mendefinisikan response model. Model itu bertindak sebagai kontrak: field dibentuk secara konsisten, data ekstra bisa disaring, dan tipe ditegakkan. Hasilnya adalah API yang lebih bersih—klien tahu apa yang diharapkan, dan Anda menghindari respons “kejutan” yang merusak integrasi.
"Async" (singkatan dari asynchronous) adalah cara agar API Anda menangani banyak request secara efisien ketika banyak waktu dihabiskan untuk menunggu.
Bayangkan seorang barista menerima pesanan. Jika mereka harus berdiri diam dan tidak melakukan apa-apa saat mesin espresso bekerja, mereka akan melayani lebih sedikit pelanggan. Pendekatan yang lebih baik: mulai membuat kopi, lalu ambil pesanan berikutnya selagi mesin bekerja.
Async bekerja seperti itu. Aplikasi FastAPI Anda dapat memulai operasi yang menunggu sesuatu yang lambat—mis. permintaan jaringan atau query database—dan saat menunggu, ia dapat menangani request lain yang masuk.
Async sangat membantu ketika API Anda banyak melakukan I/O (input/output)—hal yang banyak menghabiskan waktu menunggu daripada “berpikir”. Contoh umum:
Jika endpoint Anda sering menunggu operasi tersebut, async dapat meningkatkan throughput dan mengurangi kemungkinan request menumpuk ketika beban tinggi.
Async bukan tombol ajaib untuk semua hal. Jika endpoint Anda kebanyakan berat CPU—seperti mengubah ukuran gambar besar, menjalankan perhitungan data science, atau mengenkripsi payload besar—async tidak akan mempercepat komputasi itu sendiri. Dalam kasus tersebut, biasanya Anda memerlukan taktik berbeda (background workers, process pool, atau skala horizontal).
Anda tidak perlu menulis ulang semuanya untuk memakai FastAPI. Anda bisa menulis fungsi route biasa (sinkron) dan FastAPI akan menjalankannya dengan baik. Banyak proyek mencampur kedua gaya: pertahankan endpoint sederhana sinkron, dan gunakan async def di tempat yang jelas membantunya (biasanya di sekitar panggilan database atau HTTP eksternal).
Validasi adalah pos pemeriksaan antara dunia luar dan kode Anda. Ketika API menerima input (body JSON, query params, path params), Anda ingin memastikan data itu lengkap, bertipe benar, dan dalam batas wajar—sebelum menulis ke database, memanggil layanan lain, atau memicu logika bisnis.
FastAPI mengandalkan Pydantic untuk ini. Anda mendeskripsikan seperti apa “data baik” itu sekali, dan FastAPI otomatis:
Jika klien mengirim bentuk data yang salah, FastAPI merespons dengan 422 Unprocessable Entity dan payload error terstruktur yang menunjuk field tepat dan alasannya. Itu memudahkan pengembang klien memperbaiki request cepat, tanpa menebak-nebak.
Berikut model kecil yang menunjukkan field wajib, tipe, batas min/max, dan format:
from pydantic import BaseModel, EmailStr, Field
class UserCreate(BaseModel):
email: EmailStr
age: int = Field(ge=13, le=120)
username: str = Field(min_length=3, max_length=20)
email harus ada.age harus integer.age dibatasi 13–120.EmailStr menegakkan bentuk email yang valid.Model yang sama dapat membentuk output, sehingga respons API Anda tidak sengaja membocorkan field internal. Anda mengembalikan objek Python; FastAPI (melalui Pydantic) mengubahnya menjadi JSON dengan nama field dan tipe yang benar.
Salah satu fitur paling praktis FastAPI adalah menghasilkan dokumentasi API untuk Anda secara otomatis—berdasarkan kode yang sudah Anda tulis.
OpenAPI adalah standar untuk mendeskripsikan API dalam format terstruktur (biasanya JSON). Anggap ini sebagai “kontrak” yang menjabarkan:
GET /users/{id})Karena bisa dibaca mesin, alat dapat menggunakannya untuk menghasilkan client, memvalidasi request, dan menyelaraskan tim.
FastAPI menyajikan dua halaman docs yang ramah manusia secara otomatis:
Di proyek FastAPI tipikal, Anda akan menemukannya di:
/docs (Swagger UI)/redoc (ReDoc)Saat Anda mengubah path parameter, request model, response model, atau aturan validasi, skema OpenAPI (dan halaman docs) otomatis diperbarui. Tidak perlu langkah pemeliharaan dokumentasi terpisah.
Aplikasi FastAPI bisa sangat kecil namun terasa “nyata”. Anda mendefinisikan objek Python bernama app, menambahkan beberapa route, dan menjalankan server lokal untuk mencobanya di browser.
Berikut contoh paling kecil yang berguna:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"message": "Hello, FastAPI"}
Itu saja: satu route (GET /) yang mengembalikan JSON.
Agar terasa seperti API, mari simpan item dalam list. Ini bukan database—data akan reset saat server restart—tetapi sempurna untuk belajar.
from fastapi import FastAPI
app = FastAPI()
items = []
@app.post("/items")
def create_item(name: str):
item = {"id": len(items) + 1, "name": name}
items.append(item)
return item
@app.get("/items")
def list_items():
return items
Sekarang Anda bisa:
POST /items?name=Coffee untuk menambah itemGET /items untuk mengambil daftarStruktur starter yang umum adalah:
main.py (membuat app dan route)requirements.txt atau pyproject.toml (dependensi)Anda biasanya:
uvicorn main:app --reload)http://127.0.0.1:8000 dan coba endpoint"Dependencies" FastAPI adalah input bersama yang dibutuhkan endpoint Anda—seperti session database, user yang sedang login, pengaturan aplikasi, atau parameter query umum. Alih-alih membuat atau mem-parse ini di setiap route, Anda mendefinisikannya sekali dan membiarkan FastAPI menyediakannya di mana perlu.
Sebuah dependency biasanya fungsi (atau kelas) yang mengembalikan nilai yang dapat dipakai endpoint Anda. FastAPI akan memanggilnya untuk Anda, menentukan apa yang dibutuhkannya (berdasarkan parameternya), dan menyuntikkan hasilnya ke fungsi operasi path.
Ini sering disebut dependency injection, tetapi Anda bisa menganggapnya sebagai: “nyatakan apa yang Anda butuhkan, dan FastAPI yang menghubungkan.”
Tanpa dependencies, Anda mungkin:
Dengan dependencies, Anda memusatkan logika itu. Jika nanti Anda mengubah cara membuat session DB atau memuat user saat ini, Anda memperbarui satu tempat—bukan puluhan endpoint.
page/limit dan validasinya.Berikut pola konseptual yang sering terlihat di banyak aplikasi FastAPI:
from fastapi import Depends, FastAPI
app = FastAPI()
def get_settings():
return {"items_per_page": 20}
@app.get("/items")
def list_items(settings=Depends(get_settings)):
return {"limit": settings["items_per_page"]}
Anda mendeklarasikan dependency dengan Depends(...), dan FastAPI meneruskan hasilnya ke parameter endpoint. Pendekatan yang sama bekerja untuk blok yang lebih kompleks (seperti get_db() atau get_current_user()), membantu kode tetap bersih seiring bertumbuhnya API.
FastAPI tidak “mengamankan otomatis” API Anda—Anda memilih skema dan menghubungkannya ke endpoint. Kabar baiknya: FastAPI menyediakan blok bangunan (terutama melalui sistem dependency) yang membuat pola keamanan umum mudah diimplementasikan.
Autentikasi menjawab: “Siapa Anda?” Otorisasi menjawab: “Apa yang Anda boleh lakukan?”
Contoh: seorang user mungkin terautentikasi (login/token valid) tapi tetap tidak berhak mengakses route khusus admin.
X-API-Key). Atur rotasi dan revokasi.FastAPI mendukung pola-pola ini lewat utilitas seperti fastapi.security dan dengan mendokumentasikannya rapi di OpenAPI.
Jika Anda menyimpan password user, jangan pernah menyimpan plain text. Simpan hash lambat dengan salt (mis. bcrypt/argon2 melalui library terpercaya). Pertimbangkan juga rate limiting dan kebijakan penguncian akun.
Keamanan soal detail: penyimpanan token, pengaturan CORS, HTTPS, manajemen rahasia, dan pemeriksaan otorisasi yang benar pada setiap endpoint sensitif. Anggap helper bawaan sebagai titik awal, dan validasi pendekatan Anda lewat review dan tes sebelum digunakan di produksi.
Testing adalah tempat janji FastAPI “bekerja di mesin saya” berubah menjadi keyakinan untuk merilis. Kabar baik: FastAPI dibangun di atas Starlette, sehingga Anda mendapatkan alat testing yang kuat tanpa banyak setup.
Unit test berfokus pada bagian kecil: fungsi yang menghitung nilai, dependency yang memuat user, atau metode service yang berbicara ke database (sering dimock).
Integration test menjalankan API end-to-end: Anda memanggil endpoint dan memastikan respons HTTP penuh. Tes ini menangkap kesalahan routing, wiring dependency, dan masalah validasi.
Suite tes yang sehat biasanya memiliki lebih banyak unit test (cepat) dan lebih sedikit integration test (kepercayaan tinggi).
Aplikasi FastAPI dapat dites “seperti klien” menggunakan TestClient Starlette, yang mengirim request ke aplikasi Anda secara in-process—tanpa server.
from fastapi.testclient import TestClient
from app.main import app
client = TestClient(app)
def test_healthcheck():
r = client.get("/health")
assert r.status_code == 200
Uji hal-hal yang diandalkan pengguna dan sistem lain:
Gunakan data yang dapat diprediksi, isolasi layanan eksternal (mock atau gunakan DB test), dan hindari state bersama antar tes. Tes cepat akan sering dijalankan; tes lambat cenderung dilewatkan.
Membawa aplikasi FastAPI online sebagian besar soal memilih “runner” yang tepat dan menambahkan beberapa keperluan produksi.
Saat Anda menjalankan uvicorn main:app --reload secara lokal, Anda menggunakan setup development: auto-reload, error yang verbose, dan pengaturan yang memprioritaskan kenyamanan.
Di produksi, biasanya Anda menjalankan Uvicorn tanpa reload, sering di belakang process manager (seperti Gunicorn dengan worker Uvicorn) atau di balik reverse proxy. Tujuannya stabilitas: restart terkontrol, performa dapat diprediksi, dan default yang lebih aman.
Polanya umum:
Ini membuat satu basis kode dapat dideploy ke banyak environment tanpa mengedit file.
Sebelum menyatakan “siap”, pastikan Anda memiliki:
/health untuk monitoring uptime dan load balancer.Jika Anda pindah dari “bekerja lokal” ke “siap kirim”, juga berguna menstandarkan bagaimana Anda menghasilkan dan mengelola kontrak API. Beberapa tim memadukan output OpenAPI FastAPI dengan workflow otomatis—mis. menghasilkan client, memvalidasi request di CI, dan deployment yang konsisten. Alat seperti Koder.ai juga bisa cocok: Anda bisa mendeskripsikan API yang Anda inginkan lewat chat, iterasi endpoint dan model dengan cepat, lalu ekspor kode sumber untuk pipeline normal review/deploy.
FastAPI adalah framework web Python untuk membangun API dengan sedikit boilerplate. Anda menulis fungsi endpoint (mis. @app.get("/users")) dan FastAPI menangani routing, parsing request, validasi, dan respons JSON.
Manfaat utamanya adalah bahwa type hints dan model Pydantic Anda berfungsi sebagai kontrak eksplisit untuk apa yang API terima dan kembalikan.
API adalah sekumpulan URL (endpoint) yang dapat dipanggil oleh perangkat lunak lain untuk bertukar data.
Misalnya, klien bisa meminta data cuaca dengan GET /weather?city=Berlin, dan server merespons dengan JSON terstruktur. Klien tidak perlu akses langsung ke database—mereka hanya menggunakan respons API.
Routing memetakan metode HTTP + path ke fungsi Python.
Di FastAPI Anda biasanya menggunakan dekorator:
@app.get("/items") untuk operasi baca@app.post("/items") untuk operasi buat@app.put("/items/{id}") untuk mengganti/memperbaruiPath parameter adalah bagian dari struktur URL dan biasanya mengidentifikasi resource tertentu (wajib).
GET /users/42 → 42 adalah path parameterQuery parameter ditambahkan setelah ? dan biasanya berupa filter atau kontrol opsional.
Model Pydantic mendefinisikan bentuk dan aturan data (tipe, field wajib, batasan). FastAPI menggunakannya untuk:
Jika validasi gagal, FastAPI biasanya merespons dengan 422 Unprocessable Entity dan rincian field yang bermasalah.
FastAPI otomatis menghasilkan skema OpenAPI dari endpoint, type hints, dan model Anda.
Anda biasanya mendapatkan dokumentasi interaktif gratis:
/docs/redocKarena skema diturunkan dari kode, dokumentasi akan selalu sinkron saat Anda mengubah parameter dan model.
Gunakan async def ketika endpoint Anda banyak menghabiskan waktu menunggu I/O (panggilan database, HTTP eksternal, penyimpanan objek/file).
Gunakan def biasa ketika:
Bercampurnya endpoint sync dan async dalam satu aplikasi adalah hal yang umum.
Dependencies adalah “blok bangunan” yang dapat digunakan ulang dan diinjeksikan ke endpoint melalui Depends().
Mereka umum dipakai untuk:
Ini mengurangi pengulangan dan memusatkan logika lintas-lintas sehingga perubahan cukup dilakukan di satu tempat.
FastAPI tidak mengamankan API Anda secara otomatis—Anda memilih skema dan menghubungkannya ke endpoint. Pola umum meliputi:
Hal dasar yang harus diingat:
Untuk testing, Anda bisa menggunakan TestClient dari FastAPI/Starlette untuk memanggil API dalam proses (tanpa server).
Hal praktis yang perlu diuji:
Untuk deployment, jalankan server ASGI (mis. Uvicorn; kadang bersama Gunicorn atau di balik reverse proxy) dan tambahkan kebutuhan produksi seperti logging, health checks (), timeout, dan konfigurasi berbasis lingkungan.
@app.delete("/items/{id}") untuk menghapusIni membuat permukaan API mudah dipindai langsung dari kode.
GET /users?limit=10&active=true → limit, active adalah query parameter/health