Sobat IT RS, pernah nggak dapet permintaan gini: "Mas, data pasien itu bisa dibuka nggak ke sistem lain? Aplikasi dari vendor lab minta data demografi pasien biar nggak ngisi manual." Nah, di titik itu biasanya kita mulai garuk-garuk kepala. Pengennya sih langsung kasih akses database produksi SIMRS, tapi kalau iya, siap-siap aja ditelpon tengah malam gara-gara data bocor atau tabel ke-lock. Solusi yang proper ya satu: bikin API sendiri.

Bukan cuma soal gengsi atau "biar keren" — API itu jembatan resmi antara SIMRS kamu dan sistem lain, dengan aturan main yang jelas. Kamu yang pegang kendali: siapa yang boleh minta data, data apa aja yang boleh keluar, dan gimana kalau terjadi kesalahan. Di artikel ini kita bakal bikin satu API sederhana buat narik data demografi pasien, lengkap dari nol: konsep, kode, sampai cara uji. Anggap ini pondasi — kalau kamu udah paham pola ini, nambah endpoint buat data lain tinggal ngikutin template yang sama.

Dulu, Apa Sih Sebenarnya REST API Itu?

Tenang, nggak perlu mikir yang njelimet dulu. REST API itu sebenernya cuma "meja pelayanan" antara dua aplikasi. Aplikasi yang minta data (client) datang ke meja dengan permintaan tertentu, dan server (SIMRS kamu) melayani sesuai aturan yang udah disepakati. Permintaan itu disebut request, jawabannya disebut response. Dua-duanya dikirim dalam format yang bisa dibaca mesin, biasanya JSON.

Supaya gampang kebayang, analoginya kayak antri di loket pendaftaran RS. Kamu (client) datang, bilang "saya mau data pasien atas nama Budi", petugas (API) cek buku, lalu kasih kartu yang isinya data Budi. Yang penting di sini: petugas nggak pernah kasih kamu akses ke gudang arsip seluruh rumah sakit — dia cuma ngasih apa yang kamu minta, sesuai aturan.

Anatomi Satu Request API

Setiap request REST API punya empat bagian penting yang wajib kamu kenali:

  • Method — kata kerjanya: GET (minta data), POST (kirim data baru), PUT (ubah data), DELETE (hapus data).
  • URL / endpoint — alamatnya: misal /api/v1/pasien/12345.
  • Header — info tambahan kayak format data atau token autentikasi.
  • Body — isi pesannya, biasanya dipakai buat method POST/PUT.

Kalau di dunia SIMRS, contoh endpoint yang masuk akal kira-kira begini:

  • GET /api/v1/pasien/12345 — ambil data pasien dengan nomor rekam medis 12345
  • GET /api/v1/pasien?nama=Budi — cari pasien berdasarkan nama
  • POST /api/v1/pasien — daftarkan pasien baru dari sistem lain

Kenapa Harus API, Bukan Langsung Konek Database?

Ini pertanyaan yang paling sering muncul, dan jawabannya singkat: keselamatan. Kalau vendor lain dikasih kredensial langsung ke database SIMRS, artinya mereka punya akses penuh — bisa baca tabel lain, bisa salah query yang bikin database lemot, bahkan bisa (dengan sengaja atau nggak) mengubah data. Satu kesalahan query tanpa index aja bisa bikin CPU server ngebut kenceng pas jam sibuk pendaftaran pagi. Duh, makin panjang rambut deh.

Dengan API, kamu bisa pasang aturan yang ketat:

  • Data yang dibatasi — hanya field yang memang dibutuhkan, misal nama, tanggal lahir, alamat, nomor HP. Nggak ada ceritanya NIK atau riwayat penyakit ikut bocor.
  • Autentikasi wajib — siapa yang nggak punya token, nggak bisa masuk.
  • Audit trail — kamu tahu siapa yang narik data, kapan, dan data apa.
  • Rate limit — batasi jumlah request per detik biar nggak bikin server jebol.

Intinya: API itu kayak "petugas loket yang sopan tapi tegas". Data dikasih, tapi tetap dalam koridor yang kamu tentukan.

Persiapan Sebelum Ngoding

Buat tutorial ini, kita pakai stack yang ringan dan familiar di kalangan IT RS: Python + FastAPI. Kenapa FastAPI? Karena syntax-nya singkat, dokumentasi API-nya (Swagger) kebentuk otomatis, dan performanya cukup ngebut buat kebutuhan internal RS. Kalau rumah sakitmu udah pakai bahasa lain kayak PHP (Laravel) atau Node.js (Express), konsepnya tetap sama — tinggal menyesuaikan syntax aja.

Yang perlu disiapkan:

  • Python 3.9 ke atas
  • Library: fastapi, uvicorn, dan driver database sesuai SIMRS kamu (misal psycopg2 buat PostgreSQL atau pymysql buat MySQL)
  • Database SIMRS (untuk contoh ini kita akses read-only, biar aman)

Install dulu dependensinya:

pip install fastapi uvicorn psycopg2-binary

Gampang kan? Sekarang kita masuk ke bagian yang paling seru: nulis kodenya.

Kode Dasar: Endpoint Narik Data Pasien

Buka editor favoritmu dan buat file main.py. Ini versi paling sederhana yang udah bisa dipakai buat narik data demografi pasien berdasarkan nomor rekam medis:

from fastapi import FastAPI, HTTPException
import psycopg2

app = FastAPI(title="API SIMRS", version="1.0.0")

DB = {
    "host": "localhost",
    "database": "simrs",
    "user": "api_readonly",
    "password": "ganti_password_ini"
}

def get_connection():
    return psycopg2.connect(**DB)

@app.get("/api/v1/pasien/{norm}")
def ambil_pasien(norm: str):
    conn = get_connection()
    cur = conn.cursor()
    cur.execute("""
        SELECT norm, nama, tanggal_lahir, alamat, no_hp
        FROM pasien
        WHERE norm = %s
    """, (norm,))
    row = cur.fetchone()
    cur.close()
    conn.close()
    if row is None:
        raise HTTPException(status_code=404, detail="Pasien tidak ditemukan")
    return {
        "norm": row[0],
        "nama": row[1],
        "tanggal_lahir": str(row[2]),
        "alamat": row[3],
        "no_hp": row[4]
    }

Beberapa hal yang wajib kamu perhatikan dari kode di atas:

  • Query pakai parameterisasi (%s), bukan string concat. Ini benteng pertama dari serangan SQL injection. Jangan pernah menulis query kayak f"SELECT ... WHERE norm = '{norm}'" — itu resep bencana.
  • User database khusus (api_readonly) yang cuma punya hak SELECT, bukan akun admin. Kalau API ini dibobol, dampaknya terbatas.
  • Error handling — kalau data nggak ketemu, kita kasih kode 404 dengan pesan yang jelas, bukan error 500 yang bikin bingung.

Nambah Fitur Pencarian Berdasarkan Nama

Bikin satu endpoint lagi buat cari pasien dari nama, biar lebih berguna. Vendor atau aplikasi internal lain biasanya butuh ini buat validasi sebelum ngisi data:

@app.get("/api/v1/pasien")
def cari_pasien(nama: str = ""):
    conn = get_connection()
    cur = conn.cursor()
    cur.execute("""
        SELECT norm, nama, tanggal_lahir, no_hp
        FROM pasien
        WHERE nama ILIKE %s
        LIMIT 20
    """, (f"%{nama}%",))
    rows = cur.fetchall()
    cur.close()
    conn.close()
    return [
        {"norm": r[0], "nama": r[1], "tanggal_lahir": str(r[2]), "no_hp": r[3]}
        for r in rows
    ]

Perhatikan LIMIT 20 — ini penting banget. Tanpa limit, query pencarian bisa narik ribuan baris sekaligus dan bikin database lemot. Lagi-lagi, pelajaran yang sama: jaga performa, jaga server.

Jalankan dan Uji API-nya

Jalankan server dengan uvicorn:

uvicorn main:app --host 0.0.0.0 --port 8000

Setelah jalan, buka browser ke http://localhost:8000/docs. Di situ kamu bakal lihat dokumentasi interaktif yang otomatis dibuat FastAPI — lengkap dengan tombol "Try it out" buat uji coba langsung. Seru kan? Nggak perlu nulis dokumentasi manual lagi.

Buat uji cepat dari terminal, kamu juga bisa pakai curl:

curl -X GET "http://localhost:8000/api/v1/pasien/12345"

Kalau berhasil, balasannya kira-kira begini:

{
  "norm": "12345",
  "nama": "Budi Santoso",
  "tanggal_lahir": "1985-03-12",
  "alamat": "Jl. Melati No. 10, Yogyakarta",
  "no_hp": "081234567890"
}

Nah, itu dia data demografi pasien yang diminta, dalam format JSON yang rapi. Dari sini, aplikasi vendor bisa langsung pakai data tersebut tanpa harus nyentuh database SIMRS kamu sama sekali.

Jangan Lupa Pengamanan: API Key / Token

Endpoint di atas masih "telanjang" — siapa aja yang tahu URL-nya bisa narik data. Buat dipakai beneran di RS, kamu wajib tambah autentikasi. Cara paling simpel buat mulai: pakai API key lewat header.

from fastapi import Header, HTTPException

API_KEYS = {"vendor-lab-2026": "cuma-key-untuk-vendor-lab"}

@app.get("/api/v1/pasien/{norm}")
def ambil_pasien(norm: str, x_api_key: str = Header(default="")):
    if x_api_key not in API_KEYS:
        raise HTTPException(status_code=401, detail="API key tidak valid")
    # ... lanjut query seperti sebelumnya

Buat skala yang lebih serius, pertimbangkan juga:

  • Token JWT yang punya masa berlaku, biar key nggak berlaku selamanya kalau bocor.
  • HTTPS wajib — jangan pernah kirim key lewat HTTP polos, apalagi kalau API-nya diakses dari jaringan luar.
  • Rate limiting — misal maksimal 30 request per menit per client, biar kalau ada yang nyoba brute-force, langsung ketahan.
  • Log akses — catat siapa akses kapan dan data apa yang diambil. Ini juga penting buat kebutuhan audit akreditasi.

Ingat aturan emasnya: data pasien itu data yang paling sensitif di RS. Keamanan bukan fitur tambahan, tapi harga mati.

Catatan Penting buat Tim IT RS

Sebelum kamu langsung pasang ini di produksi, ada beberapa hal yang kudu dipertimbangkan:

  • Selalu pakai user database read-only buat API yang cuma baca data. Jangan pernah pakai akun superuser.
  • Kelompokkan API per versi (/api/v1/, nanti /api/v2/). Ini ngebantu banget kalau suatu saat struktur data berubah tapi vendor lama belum bisa upgrade.
  • Dokumentasikan ke vendor — kasih mereka contoh request dan response, plus tabel daftar kode error yang bisa muncul. Ini nyegah banyak banget telponan bolak-balik.
  • Uji dulu di lingkungan staging sebelum dipakai produksi. Bikin data dummy, test semua skenario: data ketemu, data nggak ketemu, key salah, server mati.
  • Coordinate dengan tim DB — pastikan query yang kamu tulis nggak bikin beban berat di jam sibuk. Tambah index di kolom yang sering dicari (misal norm dan nama).

Penutup: Dari Nol ke Jembatan Data yang Rapi

Nah, itu dia cara bikin API sendiri buat narik data demografi pasien. Sebenernya nggak sesulit yang dikira, kan? Yang penting cuma empat hal: pahami konsep request-response, tulis query yang aman, pasang autentikasi, dan selalu jaga performa. Dengan API, kamu nggak cuma ngejawab permintaan vendor hari ini, tapi juga nyiapin fondasi buat integrasi-integrasi berikutnya — SATUSEHAT, sistem laboratorium, antrian online, dan lain-lain.

Kalau nanti ada kendala pas implementasi — entah soal query yang lambat, vendor yang minta data di luar kesepakatan, atau bingung milih metode autentikasi — jangan ragu tanya-tanya. Dunia integrasi SIMRS itu luas, tapi pelan-pelan pasti kebuka. Selamat ngoding, Sobat IT RS, dan semoga nggak ada lagi deh istilah "data diisi manual dua kali".