Dari HL7 v2 ke FHIR, dan kenapa REST + JSON
Pertanyaan pembuka yang hampir pasti muncul, dijelaskan dengan bahasa developer JavaScript
application/fhir+json, resourceType).
Semua fakta di bawah diambil dari spesifikasi FHIR R4 (v4.0.1) dan dikutip [n]. Contoh JSON dan TypeScript hanya untuk dibaca, tidak perlu dijalankan. REST, HTTP status, JSON, dan OAuth sudah Anda kuasai; lesson ini hanya mengajarkan yang khas FHIR.
1. Dari HL7 v2 ke FHIR
FHIR (Fast Healthcare Interoperability Resources) adalah "a next generation standards framework created by HL7" yang menggabungkan "the best features of HL7's" v2, v3, dan CDA. [1] Untuk interview, pembandingnya hampir selalu HL7 v2: standar pesan lama yang masih banyak berjalan di rumah sakit.
MSH|^~\&|LAB|RSUD|EHR|RSUD|202410261030||ORU^R01|MSG0001|P|2.5
PID|1||RM-00123^^^RSUD^MR||Santoso^Budi||19800512|M
OBX|1|NM|2339-0^Glucose^LN||95|mg/dL|70-99|N|||F
Ilustrasi pesan v2 yang disederhanakan (bukan dikutip dari spesifikasi): satu pesan, baris = segment, field dipisah |, komponen dipisah ^, seperti contoh |^Smith^John| di halaman perbandingan v2. [2]
| HL7 v2 | FHIR | |
|---|---|---|
| Unit | pesan dari "re-usable segments"; "segments can't be independently manipulated" | Resource: "All exchangeable content is defined as a resource" [3], masing-masing punya URL sendiri |
| Variasi | "One of the biggest challenges with HL7 v2 interoperability is the variation of implementation" | core kecil, variasi dikelola eksplisit lewat profile (lesson 0003) |
| Data lokal | Z-segment: maknanya "opaque without prior manual explanation by the sender" | extension: "can appear at any level (including within data types)", punya URL definisi |
| Update | bisa kirim sebagian + kode penghapusan | "requiring all data to be present as a snapshot" |
| Teks manusia | tidak wajib | "FHIR requires human readable content to be provided for each resource" |
Kutipan kolom HL7 v2 dan baris extension/update/teks: [2]. Keduanya tidak saling meniadakan: FHIR menyebut "Evolutionary development path from HL7 Version 2 and CDA: standards can co-exist and leverage each other". [1] Di interview, sebut bahwa integrasi nyata sering memetakan pesan v2 lama ke resource FHIR (dibahas di lesson 0023).
Latihan 1 — v2 atau FHIR?
Jawab tanpa scroll ke atas. Soal yang sama muncul lagi, diacak, di review campuran 0012.
Kuis di lesson ini adalah feedback cepat, bukan bukti penguasaan; yang dicatat hanya hasil review 0012.
2. Kenapa REST + JSON: fondasi yang sudah Anda kuasai
FHIR berdiri di atas "Web standards: XML, JSON, HTTP, OAuth, etc." dan mendukung "RESTful architectures". [1]
Halaman REST API-nya berstatus Normative dan menyebut FHIR "a 'RESTful' specification based on common industry level use of the term REST",
dengan pola URL VERB [base]/[type]/[id]. [4]
Jadi bagi developer Node, membaca satu pasien adalah fetch biasa:
// base = "https://fhir.contoh-rs.id/fhir" (contoh fiktif)
const res = await fetch(`${base}/Patient/123`, {
headers: { Accept: "application/fhir+json" },
});
const patient = await res.json(); // { resourceType: "Patient", id: "123", ... }
- MIME type JSON-nya: "The MIME-type for this format is
application/fhir+json." [5] - Setiap resource adalah objek JSON "with a property
resourceTypewhich informs the parser which resource type this is". [5] - REST bukan satu-satunya jalan: "you do not have to use REST to make use of resources" (ada juga dokumen dan messaging). [3] Detail interaksi REST, search, dan Bundle ada di lesson 0008.
Padanan TypeScript yang paling membantu: resourceType adalah discriminant dari union type, persis seperti field type di reducer Redux.
type Meta = { versionId?: string; lastUpdated?: string; profile?: string[] };
interface Resource { resourceType: string; id?: string; meta?: Meta }
interface Patient extends Resource { resourceType: "Patient"; birthDate?: string }
interface Observation extends Resource { resourceType: "Observation"; status: string }
function label(r: Patient | Observation): string {
switch (r.resourceType) { // TypeScript mempersempit tipe di tiap case
case "Patient": return `Pasien, lahir ${r.birthDate ?? "?"}`;
case "Observation": return `Observasi (${r.status})`;
}
}
Tipe di atas sengaja diringkas. Kardinalitas aslinya: Patient.birthDate 0..1 [6], Observation.status 1..1 [7].
Latihan 2 — REST + JSON
Latihan 3 — Ucapkan dengan suara keras
Pasang timer dan jawab dengan suara keras, seolah sedang interview. Jangan buka jawaban contoh sebelum selesai.
"Apa itu FHIR, dan apa bedanya dengan HL7 v2?" (60 detik)
Bandingkan dengan jawaban contoh dan checklist-nya
"FHIR, Fast Healthcare Interoperability Resources, adalah standar HL7 untuk pertukaran data kesehatan yang dibangun dari komponen modular bernama Resource, misalnya Patient, Encounter, Observation.
Setiap resource punya identitas URL, versi, dan bisa dibaca atau diubah sendiri lewat REST API, dengan format JSON (application/fhir+json) atau XML, di atas standar web yang sudah kita kenal: HTTP, JSON, OAuth.
HL7 v2 adalah standar pesan yang lebih tua: pesan terdiri dari segment teks berdelimiter, segment tidak bisa dimanipulasi sendiri, dan implementasinya sangat bervariasi antar sistem; data lokal masuk Z-segment yang maknanya harus dijelaskan manual.
Di FHIR, data lokal masuk extension yang punya URL ke definisinya, dan variasi dikelola lewat profile dan Implementation Guide. Keduanya bisa hidup berdampingan; banyak integrasi memetakan v2 ke FHIR."
Checklist: apakah Anda menyebut…
- FHIR = standar HL7, dibangun dari Resource modular (contoh: Patient, Observation)?
- Resource punya identitas URL dan versi, bisa dibaca/diubah sendiri?
- REST API + JSON/XML di atas standar web (HTTP, OAuth)?
- HL7 v2 = pesan dari segment, segment tidak bisa dimanipulasi sendiri?
- masalah v2: variasi implementasi tinggi; Z-segment maknanya tidak jelas tanpa penjelasan manual?
- padanan di FHIR: extension ber-URL + profile/IG; v2 dan FHIR bisa berdampingan?
Lulus kalau minimal 4 dari 6.
Istilah: GLOSSARY.md (bagian "Fondasi") · Sumber: RESOURCES.md · Komunitas: chat.fhir.org
Ada yang belum jelas? Tanyakan ke saya (agent) di terminal, misalnya: "apa beda id dan identifier?", "kapan sebuah extension harus jadi modifierExtension?", atau "bagaimana menjelaskan Normative vs Trial Use ke interviewer non-teknis?"
Sumber: [1] FHIR Summary · [2] Comparison with HL7 v2 · [3] FHIR Overview · [4] RESTful API · [5] JSON Representation · [6] Patient · [7] Observation