Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card
Jak przechowywać dane medyczne za pomocą FHIR R4
Samouczek: utwórz Pacjenta, pomiar ciśnienia krwi jako Observation i Schorzenie (Condition), użyj transakcji, wyszukaj, zaktualizuj z historią i odczytaj pochodzenie danych — każde żądanie z curl i rzeczywista odpowiedź, w darmowej piaskownicy.
Ten samouczek przechowuje niewielką dokumentację medyczną jako zasoby HL7 FHIR R4: Patient, Observation ciśnienia krwi i diagnozę jako Condition, a następnie pacjenta i pomiar razem w jednej transakcji. Wyszukuje je, aktualizuje diagnozę bez utraty wcześniejszej wersji i odczytuje, kto co napisał. Każde żądanie to zwykły curl do darmowej piaskownicy Anpheros, a każda pokazana odpowiedź to to, co zwraca API.
Jeśli dopiero zaczynasz z FHIR, najpierw przeczytaj Platforma FHIR aby zapoznać się z koncepcjami. Ta strona to część praktyczna.
Trzy zasoby, od których zaczyna się większość rekordów
| Zasób | Co zawiera | Kodowane za pomocą |
|---|---|---|
Patient |
kim jest osoba, której dotyczy rekord: imię, data urodzenia, płeć, identyfikatory z innych systemów | Twoje systemy identyfikatorów |
Observation |
wszystko, co zostało zmierzone lub zgłoszone: parametry życiowe, wyniki badań laboratoryjnych, waga, wynik oceny objawów | LOINC, jednostki UCUM |
Condition |
diagnoza lub problem zdrowotny, wraz z jego statusem w czasie | ICD-10 (SNOMED CT za flagą licencyjną) |
Leki (MedicationStatement), alergie (AllergyIntolerance), szczepienia i dokumenty podążają za tym samym wzorcem; 26 obsługiwanych typów zasobów znajduje się w oświadczeniu o możliwościach (capability statement) pod adresem /fhir/R4/metadata.
Zanim zaczniesz
Uzyskaj klucz sandbox (sk_test_…) na stronie platform.anpheros.com/dashboard za pomocą opcji Get a sandbox key. Nic, co tam utworzysz, nie jest rzeczywistymi danymi pacjentów i nic nie jest widoczne dla innych projektów.
export BASE=https://platform.anpheros.com/fhir/R4
export KEY=sk_test_…
Krok 1: Utwórz pacjenta
curl -X POST "$BASE/Patient" -H "Authorization: Bearer $KEY" -H "Content-Type: application/fhir+json" -d '{
"resourceType": "Patient",
"identifier": [{"system": "https://clinic.example/mrn", "value": "MRN-10442"}],
"name": [{"family": "Marin", "given": ["Ioana"]}],
"gender": "female",
"birthDate": "1979-04-12"
}'
201 Created, z identyfikatorem i wersją przypisanymi przez serwer:
{"resourceType": "Patient",
"identifier": [{"system": "https://clinic.example/mrn", "value": "MRN-10442"}],
"name": [{"family": "Marin", "given": ["Ioana"]}], "gender": "female", "birthDate": "1979-04-12",
"id": "d09e3942-ed86-4458-b099-fa674ab21b84",
"meta": {"versionId": "1", "lastUpdated": "2026-10-12T20:16:51.043Z"}}
Zachowaj własne identyfikatory w identifier za pomocą system, nad którym masz kontrolę (tutaj numer rekordu kliniki), aby zawsze móc ponownie odnaleźć pacjenta za pomocą GET $BASE/Patient?identifier=https://clinic.example/mrn|MRN-10442. Identyfikator FHIR id należy do platformy i jest specyficzny dla Twojego projektu: inny projekt widzi tę samą osobę pod innym identyfikatorem.
export PID=d09e3942-ed86-4458-b099-fa674ab21b84
Krok 2: Zapisz pomiar jako Obserwacja
Ciśnienie krwi jest jedną obserwacją z dwoma komponentami, skurczowym i rozkurczowym, z których każdy ma swój własny kod LOINC. Podaj, kto dokonał pomiaru: tutaj urządzenie domowe.
curl -X POST "$BASE/Observation" -H "Authorization: Bearer $KEY" -H "Content-Type: application/fhir+json" \
-H "X-Anpheros-Author-Type: device" -H "Idempotency-Key: bp-2026-10-10-0830" -d '{
"resourceType": "Observation",
"status": "final",
"category": [{"coding": [{"system": "http://terminology.hl7.org/CodeSystem/observation-category", "code": "vital-signs"}]}],
"code": {"coding": [{"system": "http://loinc.org", "code": "85354-9", "display": "Blood pressure panel"}]},
"subject": {"reference": "Patient/'$PID'"},
"effectiveDateTime": "2026-10-10T08:30:00Z",
"component": [
{"code": {"coding": [{"system": "http://loinc.org", "code": "8480-6"}]},
"valueQuantity": {"value": 138, "unit": "mmHg", "system": "http://unitsofmeasure.org", "code": "mm[Hg]"}},
{"code": {"coding": [{"system": "http://loinc.org", "code": "8462-4"}]},
"valueQuantity": {"value": 88, "unit": "mmHg", "system": "http://unitsofmeasure.org", "code": "mm[Hg]"}}
]
}'
Odpowiedź to zapisany zasób z id i meta.versionId: "1". Trzy szczegóły mają znaczenie dla użytecznego rekordu:
- Kody, nie etykiety.
85354-9oznacza „panel ciśnienia krwi” w każdym systemie FHIR; tekst swobodny „BP” nie. Kody można wyszukać za pomocąGET /v1/terminology/loinc?q=blood pressure(Systemy kodów FHIR). - Jednostki UCUM (
mm[Hg],kg,mg/dL) wvalueQuantity.code, dzięki czemu wartości można porównywać i konwertować. Idempotency-Key. Ponowienie próby po upływie limitu czasu zwraca pierwszą odpowiedź zamiast dwukrotnego zapisywania odczytu.
Wyniki laboratoryjne to ten sam zasób z category laboratory i zazwyczaj referenceRange. Aby zaimportować całe raporty laboratoryjne, zobacz Jak zaimportować wyniki laboratoryjne do rekordu FHIR.
Krok 3: Rejestrowanie diagnozy jako Stanu (Condition)
curl -X POST "$BASE/Condition" -H "Authorization: Bearer $KEY" -H "Content-Type: application/fhir+json" \
-H "X-Anpheros-Author-Type: practitioner" -d '{
"resourceType": "Condition",
"subject": {"reference": "Patient/'$PID'"},
"clinicalStatus": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/condition-clinical", "code": "active"}]},
"verificationStatus": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", "code": "confirmed"}]},
"code": {"coding": [{"system": "http://hl7.org/fhir/sid/icd-10", "code": "I10", "display": "Essential (primary) hypertension"}]},
"onsetDateTime": "2026-03-02"
}'
clinicalStatus (aktywny, rozwiązany, w remisji) i verificationStatus (potwierdzony, tymczasowy) są celowo rozdzielone: podejrzewana diagnoza to nie to samo co potwierdzona, a rozwiązany problem nadal stanowi część historii.
Krok 4: Tworzenie powiązanych zasobów w jednej transakcji
Gdy pacjent i jego pierwszy pomiar przybywają razem, na przykład z systemu klinicznego, wyślij je jako transaction Bundle. Albo wszystko zostanie zapisane, albo nic. Odniesienia między nowymi zasobami używają tymczasowych urn:uuid: identyfikatorów, które serwer zastępuje:
curl -X POST "$BASE" -H "Authorization: Bearer $KEY" -H "Content-Type: application/fhir+json" -d '{
"resourceType": "Bundle", "type": "transaction",
"entry": [
{"fullUrl": "urn:uuid:9f1c0d1e-0000-4000-8000-000000000001",
"resource": {"resourceType": "Patient", "name": [{"family": "Stan", "given": ["Mihai"]}], "gender": "male", "birthDate": "1990-02-01"},
"request": {"method": "POST", "url": "Patient"}},
{"resource": {"resourceType": "Observation", "status": "final",
"category": [{"coding": [{"system": "http://terminology.hl7.org/CodeSystem/observation-category", "code": "vital-signs"}]}],
"code": {"coding": [{"system": "http://loinc.org", "code": "29463-7", "display": "Body weight"}]},
"subject": {"reference": "urn:uuid:9f1c0d1e-0000-4000-8000-000000000001"},
"effectiveDateTime": "2026-10-10",
"valueQuantity": {"value": 82.4, "unit": "kg", "system": "http://unitsofmeasure.org", "code": "kg"}},
"request": {"method": "POST", "url": "Observation"}}
]
}'
transaction-response zawiera jeden wpis na zasób, z "status": "201 Created", jego location i zapisanym zasobem. subject zasobu Observation wskazuje teraz na rzeczywisty Patient/fad3665a-….
Krok 5: wyszukiwanie
curl "$BASE/Observation?patient=$PID&code=http://loinc.org|85354-9&date=ge2026-10-01&_sort=-date" \
-H "Authorization: Bearer $KEY"
Otrzymasz searchset Bundle z total i pasującymi zasobami, w kolejności od najnowszych. Inne często używane wyszukiwania to: Condition?patient=$PID&clinical-status=active, Observation?patient=$PID&category=laboratory i Patient/$PID/$everything dla całego rekordu.
Krok 6: aktualizacja bez utraty historii
Nadciśnienie ustępuje. Zmień status i dodaj datę zakończenia, używając If-Match z odczytaną wersją, aby nigdy nie nadpisać zmian wprowadzonych przez kogoś innego:
curl -X PUT "$BASE/Condition/$CID" -H "Authorization: Bearer $KEY" -H "Content-Type: application/fhir+json" \
-H 'If-Match: W/"1"' -d '{ …the same Condition…, "clinicalStatus": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/condition-clinical", "code": "resolved"}]}, "abatementDateTime": "2026-10-11" }'
200 OK z ETag: W/"2". Jeśli inny zapis pojawił się tam pierwszy, otrzymasz 412 i musisz odczytać ponownie. Wcześniejsza wersja nadal tam jest:
curl "$BASE/Condition/$CID/_history" -H "Authorization: Bearer $KEY"
zwraca obie wersje: versionId 2 (resolved) i 1 (active). GET $BASE/Condition/$CID/_history/1 odczytuje starą wersję. Nic w rekordzie nie jest nadpisywane bez powiadomienia.
Krok 7: zobacz, kto co napisał
Każde zapisanie tworzy zasób Provenance. Dla odczytu ciśnienia krwi:
curl "$BASE/Provenance?target=Observation/$OBS" -H "Authorization: Bearer $KEY"
{"resourceType": "Provenance",
"target": [{"reference": "Observation/d83d9075-…/_history/1"}],
"recorded": "2026-10-12T20:16:51.056000Z",
"activity": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/v3-DataOperation", "code": "CREATE"}]},
"agent": [{"type": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/provenance-participant-type", "code": "author"}]},
"who": {"identifier": {"system": "https://anpheros.com/fhir/CodeSystem/author-type", "value": "device"}, "display": "proj_…"},
"onBehalfOf": {"identifier": {"system": "https://anpheros.com/fhir/sid/organization", "value": "org_…"}, "display": "…"}}]}
Typ autora, który wysłałeś (device), jest rejestrowany wraz z projektem i organizacją. Wyślij X-Anpheros-Author-Ref: Practitioner/<id>, aby nazwać lekarza stojącego za zapisem.
Krok 8: rekord jako podsumowanie
curl "$BASE/Patient/$PID/\$summary" -H "Authorization: Bearer $KEY"
zwraca Międzynarodowe Podsumowanie Pacjenta (International Patient Summary): document Bundle, który zaczyna się od Composition i zawiera sekcje takie jak Problemy, Leki, Alergie i Parametry życiowe, zbudowane z powyższych zasobów. Jest to format do przekazania innemu systemowi lub wydrukowania dla lekarza (FHIR platform).
Preferujesz JSON bez FHIR?
Te same dane są dostępne za pośrednictwem prostszego widoku REST, /v1, z tymi samymi identyfikatorami: POST /v1/patients/{id}/observations pobiera {"code": "85354-9", "category": "vital-signs", "effective_at": "…", "components": […]} i przechowuje tę samą obserwację FHIR. Użyj tego, co lepiej pasuje do Twojego kodu. Zobacz API danych medycznych i SDK.
Najczęściej zadawane pytania
Jaki jest najlepszy sposób przechowywania dokumentacji medycznej?
Jako zakodowane, wersjonowane zasoby z zapisem tego, kto je utworzył. HL7 FHIR R4 zapewnia strukturę (Patient, Observation, Condition i inne), standardowe systemy kodowania, takie jak LOINC i ICD-10, oraz historię; backend FHIR dodaje wyszukiwanie, zgody i pochodzenie.
Czy potrzebuję serwera FHIR, aby korzystać z FHIR?
Potrzebujesz miejsca, które przechowuje i wyszukuje zasoby FHIR oraz egzekwuje, kto może je odczytywać. Możesz samodzielnie uruchomić serwer FHIR typu open-source lub skorzystać z zarządzanego, takiego jak Anpheros; Jak Anpheros wypada na tle innych serwerów FHIR analizuje opcje, a FHIR vs. niestandardowa baza danych medycznych omawia tworzenie własnego schematu.
Jak przechowywać ciśnienie krwi w FHIR?
Jako jedno Observation z kodem LOINC 85354-9 i dwa wpisy component: skurczowe 8480-6 i rozkurczowe 8462-4, każdy z valueQuantity w mm[Hg].
Czy mogę zmienić zapisany zasób?
Tak, za pomocą PUT i If-Match. Każda zmiana tworzy nową wersję; wcześniejsze wersje pozostają czytelne poprzez _history, a rekordy Provenance zapisują, kto dokonał każdej zmiany. Usunięcia są miękkie i zachowują historię.
Powiązane
- Platforma FHIR: koncepcje, typy zasobów i operacje
- Systemy kodowania FHIR: LOINC, ICD-10, ATC, UCUM
- Jak zaimportować wyniki laboratoryjne do rekordu FHIR
- API danych medycznych: prostszy widok REST tych samych danych
- Darmowa baza danych i piaskownica FHIR
Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card