AnpherosAnpheros PlatformDevelopers

Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card

Πώς να αποθηκεύσετε ιατρικά αρχεία χρησιμοποιώντας FHIR R4

Οδηγός: δημιουργήστε έναν Ασθενή, μια Παρατήρηση (Observation) πίεσης αίματος και μια Κατάσταση (Condition), χρησιμοποιήστε μια συναλλαγή, αναζητήστε, ενημερώστε με ιστορικό και διαβάστε την προέλευση — κάθε αίτηση με curl και την πραγματική απόκριση, στο δωρεάν sandbox.

Αυτός ο οδηγός αποθηκεύει ένα μικρό ιατρικό αρχείο ως πόρους HL7 FHIR R4: έναν Patient, μια Observation αρτηριακής πίεσης και μια διάγνωση ως Condition, στη συνέχεια έναν ασθενή και μια μέτρηση μαζί σε μία συναλλαγή. Τα αναζητά, ενημερώνει τη διάγνωση χωρίς να χάσει την προηγούμενη έκδοση και διαβάζει ποιος έγραψε τι. Κάθε αίτημα είναι απλό curl εναντίον του δωρεάν Anpheros sandbox, και κάθε απόκριση που εμφανίζεται είναι αυτό που επιστρέφει το API.

Αν είστε νέοι στο FHIR, διαβάστε πρώτα την Πλατφόρμα FHIR για τις έννοιες. Αυτή η σελίδα είναι το πρακτικό μέρος.

Οι τρεις πόροι με τους οποίους ξεκινούν οι περισσότερες εγγραφές

Πόρος Τι περιέχει Κωδικοποιημένος με
Patient ποιος αφορά η εγγραφή: όνομα, ημερομηνία γέννησης, φύλο, αναγνωριστικά από άλλα συστήματα τα συστήματα αναγνωριστικών σας
Observation οτιδήποτε μετράται ή αναφέρεται: ζωτικά σημεία, αποτελέσματα εργαστηριακών εξετάσεων, ένα βάρος, ένα σκορ συμπτωμάτων LOINC, μονάδες UCUM
Condition μια διάγνωση ή ένα πρόβλημα υγείας, με την κατάστασή του με την πάροδο του χρόνου ICD-10 (SNOMED CT πίσω από μια άδεια χρήσης)

Τα φάρμακα (MedicationStatement), οι αλλεργίες (AllergyIntolerance), οι εμβολιασμοί και τα έγγραφα ακολουθούν το ίδιο μοτίβο· οι 26 υποστηριζόμενοι τύποι πόρων παρατίθενται στη δήλωση δυνατοτήτων στο /fhir/R4/metadata.

Πριν ξεκινήσετε

Αποκτήστε ένα κλειδί sandbox (sk_test_…) στη διεύθυνση platform.anpheros.com/dashboard με την επιλογή Get a sandbox key. Τίποτα από ό,τι δημιουργείτε εκεί δεν είναι πραγματικά δεδομένα ασθενούς και τίποτα δεν είναι ορατό σε άλλα έργα.

export BASE=https://platform.anpheros.com/fhir/R4
export KEY=sk_test_…

Βήμα 1: Δημιουργία Ασθενούς

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, με το αναγνωριστικό (id) και την έκδοση (version) που ανέθεσε ο διακομιστής (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"}}

Διατηρήστε τα δικά σας αναγνωριστικά στο identifier με ένα system που ελέγχετε (εδώ, ένας αριθμός μητρώου κλινικής), ώστε να μπορείτε πάντα να βρείτε ξανά τον ασθενή με το GET $BASE/Patient?identifier=https://clinic.example/mrn|MRN-10442. Το FHIR id είναι της πλατφόρμας και είναι συγκεκριμένο για το έργο σας: ένα άλλο έργο βλέπει το ίδιο άτομο με διαφορετικό αναγνωριστικό.

export PID=d09e3942-ed86-4458-b099-fa674ab21b84

Βήμα 2: Αποθήκευση μιας μέτρησης ως Παρατήρηση (Observation)

Η αρτηριακή πίεση είναι μια παρατήρηση με δύο συνιστώσες, τη συστολική και τη διαστολική, καθεμία με τον δικό της κωδικό LOINC. Αναφέρετε ποιος την μέτρησε: εδώ μια οικιακή συσκευή.

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]"}}
  ]
}'

Η απόκριση είναι ο αποθηκευμένος πόρος (resource) με id και meta.versionId: "1". Τρεις λεπτομέρειες είναι σημαντικές για ένα χρήσιμο αρχείο:

Τα αποτελέσματα εργαστηρίου είναι ο ίδιος πόρος με category laboratory και συνήθως ένα referenceRange. Για να εισαγάγετε ολόκληρες εργαστηριακές αναφορές, δείτε Πώς να εισαγάγετε εργαστηριακά αποτελέσματα σε ένα αρχείο FHIR.

Βήμα 3: Καταγραφή διάγνωσης ως 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 (active, resolved, in remission) και οι verificationStatus (confirmed, provisional) είναι σκόπιμα ξεχωριστές: μια υποψήφια διάγνωση δεν είναι το ίδιο με μια επιβεβαιωμένη, και ένα επιλυμένο πρόβλημα παραμένει μέρος του ιστορικού.

Βήμα 4: Δημιουργία σχετικών πόρων σε μία συναλλαγή

Όταν ένας ασθενής και η πρώτη του μέτρηση φτάνουν μαζί, για παράδειγμα από ένα σύστημα κλινικής, στείλτε τα ως transaction Bundle. Είτε αποθηκεύονται όλα είτε τίποτα. Οι αναφορές μεταξύ νέων πόρων χρησιμοποιούν προσωρινά urn:uuid: ids που ο διακομιστής αντικαθιστά:

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 έχει μία καταχώρηση ανά πόρο, με "status": "201 Created", το location του και τον αποθηκευμένο πόρο. Το subject του Observation τώρα δείχνει στο πραγματικό Patient/fad3665a-….

Βήμα 5: αναζήτηση

curl "$BASE/Observation?patient=$PID&code=http://loinc.org|85354-9&date=ge2026-10-01&_sort=-date" \
     -H "Authorization: Bearer $KEY"

Λαμβάνετε ένα searchset Bundle με total και τους αντίστοιχους πόρους, με τους νεότερους πρώτα. Άλλες αναζητήσεις που θα χρησιμοποιείτε συχνά: Condition?patient=$PID&clinical-status=active, Observation?patient=$PID&category=laboratory, και Patient/$PID/$everything για ολόκληρο το αρχείο.

Βήμα 6: Ενημέρωση χωρίς απώλεια ιστορικού

Η υπέρταση επιλύεται. Αλλάξτε την κατάσταση και προσθέστε την ημερομηνία λήξης, και χρησιμοποιήστε το If-Match με την έκδοση που διαβάσατε, ώστε να μην αντικαταστήσετε ποτέ την αλλαγή κάποιου άλλου:

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 με ETag: W/"2". Εάν μια άλλη εγγραφή έφτασε εκεί πρώτη, θα λάβετε 412 και θα διαβάσετε ξανά. Η προηγούμενη έκδοση εξακολουθεί να υπάρχει:

curl "$BASE/Condition/$CID/_history" -H "Authorization: Bearer $KEY"

επιστρέφει και τις δύο εκδόσεις: versionId 2 (resolved) και 1 (active). Το GET $BASE/Condition/$CID/_history/1 διαβάζει το παλιό. Τίποτα σε ένα αρχείο δεν αντικαθίσταται σιωπηλά.

Βήμα 7: Δείτε ποιος έγραψε τι

Κάθε εγγραφή δημιουργεί έναν πόρο Provenance. Για την καταγραφή της πίεσης του αίματος:

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": "…"}}]}

Ο τύπος συγγραφέα που στείλατε (device) καταγράφεται μαζί με το έργο και τον οργανισμό. Στείλτε X-Anpheros-Author-Ref: Practitioner/<id> για να ονομάσετε τον κλινικό ιατρό πίσω από μια εγγραφή.

Βήμα 8: ο φάκελος ως περίληψη

curl "$BASE/Patient/$PID/\$summary" -H "Authorization: Bearer $KEY"

επιστρέφει μια Διεθνή Περίληψη Ασθενούς (International Patient Summary): ένα document Bundle που ξεκινά με ένα Composition και έχει ενότητες όπως Προβλήματα, Φαρμακευτική αγωγή, Αλλεργίες και Ζωτικά σημεία, κατασκευασμένο από τους παραπάνω πόρους. Αυτή είναι η μορφή για να παραδοθεί σε άλλο σύστημα ή να εκτυπωθεί για έναν γιατρό (FHIR platform).

Προτιμάτε JSON χωρίς FHIR;

Τα ίδια δεδομένα είναι διαθέσιμα μέσω μιας απλούστερης REST προβολής, /v1, με τα ίδια αναγνωριστικά: το POST /v1/patients/{id}/observations λαμβάνει το {"code": "85354-9", "category": "vital-signs", "effective_at": "…", "components": […]} και αποθηκεύει την ίδια FHIR Observation. Χρησιμοποιήστε όποια προβολή ταιριάζει στον κώδικά σας. Δείτε το Medical data API και τα SDKs.

Συχνές Ερωτήσεις

Ποιος είναι ο καλύτερος τρόπος αποθήκευσης ιατρικών αρχείων;

Ως κωδικοποιημένοι, εκδοτικοί πόροι με αρχείο του ποιος έγραψε τον καθένα. Το HL7 FHIR R4 σας παρέχει τη δομή (Patient, Observation, Condition και άλλα), τυποποιημένα συστήματα κωδικοποίησης όπως LOINC και ICD-10, και ιστορικό. Ένα backend FHIR προσθέτει αναζήτηση, συναίνεση και προέλευση από πάνω.

Χρειάζομαι έναν FHIR server για να χρησιμοποιήσω FHIR;

Χρειάζεστε κάπου που αποθηκεύει και αναζητά πόρους FHIR και επιβάλλει ποιος μπορεί να τους διαβάσει. Μπορείτε να εκτελέσετε έναν open-source FHIR server μόνοι σας ή να χρησιμοποιήσετε έναν διαχειριζόμενο όπως το Anpheros. Το Πώς συγκρίνεται το Anpheros με άλλους FHIR servers σταθμίζει τις επιλογές, και το FHIR vs. μια προσαρμοσμένη ιατρική βάση δεδομένων καλύπτει τη δημιουργία του δικού σας σχήματος αντ' αυτού.

Πώς αποθηκεύω την αρτηριακή πίεση σε FHIR;

Ως ένα Observation με κωδικό LOINC 85354-9 και δύο component καταχωρήσεις: συστολική 8480-6 και διαστολική 8462-4, καθεμία με ένα valueQuantity σε mm[Hg].

Μπορώ να αλλάξω έναν αποθηκευμένο πόρο;

Ναι, με PUT και If-Match. Κάθε αλλαγή δημιουργεί μια νέα έκδοση. Οι προηγούμενες εκδόσεις παραμένουν αναγνώσιμες μέσω _history, και τα αρχεία Provenance καταγράφουν ποιος έκανε κάθε αλλαγή. Οι διαγραφές είναι "μαλακές" και διατηρούν το ιστορικό.

Σχετικά

Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card

Product updates by email

New features, guides and the end of the beta. One email a month at most.

Send me occasional Anpheros Platform updates by email (new features, API changes, guides). I'll confirm by email and can unsubscribe in one click from any email. Privacy