Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card
Cum se stochează dosare medicale folosind FHIR R4
Tutorial: creați un Pacient, o observație a tensiunii arteriale și o Afecțiune, folosiți o tranzacție, căutați, actualizați cu istoric și citiți proveniența — fiecare cerere cu curl și răspunsul real, pe sandbox-ul gratuit.
**Acest tutorial stochează un mic dosar medical ca resurse HL7 FHIR R4: un Patient, o Observation a tensiunii arteriale și un diagnostic sub forma unui Condition, apoi un pacient și o măsurătoare împreună într-o singură tranzacție. Le caută, actualizează diagnosticul fără a pierde versiunea anterioară și citește cine a scris ce. Fiecare cerere este curl simplu împotriva sandbox-ului gratuit Anpheros, iar fiecare răspuns afișat este ceea ce returnează API-ul.
Dacă sunteți nou în FHIR, citiți mai întâi Platforma FHIR pentru concepte. Această pagină este partea practică.
Cele trei resurse cu care încep majoritatea înregistrărilor
| Resursă | Ce conține | Codificat cu |
|---|---|---|
Patient |
despre cine este înregistrarea: nume, data nașterii, gen, identificatori din alte sisteme | sistemele dvs. de identificare |
Observation |
orice este măsurat sau raportat: semne vitale, rezultate de laborator, o greutate, un scor de simptome | LOINC, unități UCUM |
Condition |
un diagnostic sau o problemă de sănătate, cu stadiul său în timp | ICD-10 (SNOMED CT în spatele unui indicator de licență) |
Medicamentele (MedicationStatement), alergiile (AllergyIntolerance), imunizările și documentele urmează același model; cele 26 de tipuri de resurse suportate sunt listate în declarația de capabilități la /fhir/R4/metadata.
Înainte de a începe
Obțineți o cheie de sandbox (sk_test_…) la platform.anpheros.com/dashboard cu opțiunea Get a sandbox key. Nimic din ceea ce creați acolo nu reprezintă date reale ale pacienților și nimic nu este vizibil pentru alte proiecte.
export BASE=https://platform.anpheros.com/fhir/R4
export KEY=sk_test_…
Pasul 1: Crearea unui pacient
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, cu id-ul și versiunea alocate de server:
{"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"}}
Păstrați propriile id-uri în identifier cu un system pe care îl controlați (aici un număr de înregistrare al clinicii), astfel încât să puteți găsi întotdeauna pacientul din nou cu GET $BASE/Patient?identifier=https://clinic.example/mrn|MRN-10442. id FHIR este al platformei și este specific proiectului dumneavoastră: un alt proiect vede aceeași persoană sub un id diferit.
export PID=d09e3942-ed86-4458-b099-fa674ab21b84
Pasul 2: stocarea unei măsurători ca Observație
Tensiunea arterială este o observație cu două componente, sistolică și diastolică, fiecare cu propriul cod LOINC. Specificați cine a efectuat măsurătoarea: aici un dispozitiv de acasă.
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]"}}
]
}'
Răspunsul este resursa stocată cu id și meta.versionId: "1". Trei detalii sunt importante pentru un record utilizabil:
- Coduri, nu etichete.
85354-9înseamnă „panel tensiune arterială” în orice sistem FHIR; un text liber „BP” nu înseamnă. Căutați coduri cuGET /v1/terminology/loinc?q=blood pressure(Sisteme de coduri FHIR). - Unități UCUM (
mm[Hg],kg,mg/dL) învalueQuantity.code, astfel încât valorile să poată fi comparate și convertite. Idempotency-Key. O reîncercare după un timeout returnează primul răspuns în loc să stocheze citirea de două ori.
Rezultatele de laborator sunt aceeași resursă cu category laboratory și, de obicei, un referenceRange. Pentru a importa rapoarte de laborator complete, consultați Cum se importă rezultatele de laborator într-un record FHIR.
Pasul 3: înregistrați un diagnostic ca o Condiție
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 (activă, rezolvată, în remisie) și verificationStatus (confirmată, provizorie) sunt separate intenționat: un diagnostic suspectat nu este același lucru cu unul confirmat, iar o problemă rezolvată face în continuare parte din istoric.
Pasul 4: crearea resurselor asociate într-o singură tranzacție
Când un pacient și prima sa măsurătoare sosesc împreună, de exemplu dintr-un sistem de clinică, trimiteți-le ca un transaction Bundle. Fie totul este stocat, fie nimic nu este. Referințele între resursele noi folosesc urn:uuid: id-uri temporare pe care serverul le înlocuiește:
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 are o intrare per resursă, cu "status": "201 Created", location și resursa stocată. subject-ul Observation indică acum Patient/fad3665a-…-ul real.
Pasul 5: căutare
curl "$BASE/Observation?patient=$PID&code=http://loinc.org|85354-9&date=ge2026-10-01&_sort=-date" \
-H "Authorization: Bearer $KEY"
Veți primi un searchset Bundle cu total și resursele corespondente, cele mai noi primele. Alte căutări pe care le veți folosi frecvent: Condition?patient=$PID&clinical-status=active, Observation?patient=$PID&category=laboratory și Patient/$PID/$everything pentru întregul dosar.
Pasul 6: actualizare fără pierderea istoricului
Hipertensiunea arterială se rezolvă. Modificați starea și adăugați data de încheiere, și folosiți If-Match cu versiunea pe care ați citit-o pentru a nu suprascrie niciodată modificarea altcuiva:
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 cu ETag: W/"2". Dacă o altă scriere a ajuns acolo prima, veți primi 412 și veți citi din nou. Versiunea anterioară este încă acolo:
curl "$BASE/Condition/$CID/_history" -H "Authorization: Bearer $KEY"
returnează ambele versiuni: versionId 2 (resolved) și 1 (active). GET $BASE/Condition/$CID/_history/1 citește versiunea veche. Nimic dintr-o înregistrare nu este suprascris silențios.
Pasul 7: vedeți cine a scris ce
Fiecare scriere creează o resursă Provenance. Pentru înregistrarea tensiunii arteriale:
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": "…"}}]}
Tipul autorului pe care l-ați trimis (device) este înregistrat împreună cu proiectul și organizația. Trimiteți X-Anpheros-Author-Ref: Practitioner/<id> pentru a numi clinicianul din spatele unei scrieri.
Pasul 8: înregistrarea ca rezumat
curl "$BASE/Patient/$PID/\$summary" -H "Authorization: Bearer $KEY"
returnează un Rezumat Internațional al Pacientului (International Patient Summary): un document Bundle care începe cu un Composition și are secțiuni precum Probleme, Medicație, Alergii și Semne vitale, construit din resursele de mai sus. Acesta este formatul de transmis către un alt sistem sau de tipărit pentru un medic (platforma FHIR).
Preferi JSON fără FHIR?
Aceleași date sunt disponibile printr-o vizualizare REST mai simplă, /v1, cu aceleași ID-uri: POST /v1/patients/{id}/observations preia {"code": "85354-9", "category": "vital-signs", "effective_at": "…", "components": […]} și stochează același FHIR Observation. Folosește ce se potrivește codului tău. Vezi Medical data API și SDKs.
Întrebări frecvente
Care este cea mai bună modalitate de a stoca dosare medicale?
Ca resurse codificate, versionate, cu o înregistrare a cine a scris fiecare. HL7 FHIR R4 vă oferă structura (Patient, Observation, Condition și altele), sisteme de codificare standard precum LOINC și ICD-10, și istoric; un backend FHIR adaugă căutare, consimțământ și proveniență deasupra.
Am nevoie de un server FHIR pentru a utiliza FHIR?
Aveți nevoie de un loc care stochează și caută resurse FHIR și impune cine le poate citi. Puteți rula singur un server FHIR open-source sau puteți utiliza unul gestionat precum Anpheros; Cum se compară Anpheros cu alte servere FHIR analizează opțiunile, iar FHIR vs. o bază de date medicală personalizată acoperă crearea propriului schemă în schimb.
Cum stochez tensiunea arterială în FHIR?
Ca o singură Observation cu codul LOINC 85354-9 și două component intrări: sistolică 8480-6 și diastolică 8462-4, fiecare cu o valueQuantity în mm[Hg].
Pot modifica o resursă stocată?
Da, cu PUT și If-Match. Fiecare modificare creează o nouă versiune; versiunile anterioare rămân lizibile prin _history, iar Provenance înregistrează cine a făcut fiecare modificare. Ștergerile sunt soft și păstrează istoricul.
Conexe
- Platforma FHIR: conceptele, tipurile de resurse și operațiunile
- Sisteme de coduri FHIR: LOINC, ICD-10, ATC, UCUM
- Cum se importă rezultatele de laborator într-un fișier FHIR
- API pentru date medicale: vizualizarea REST mai simplă a acelorași date
- Bază de date și sandbox FHIR gratuite
Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card