نظرة عامة موجزة
HL7 FHIR (مصادر تبادل معلومات الرعاية الصحية السريعة) هو معيار تبادل بيانات الرعاية الصحية الحديث باستخدام واجهات RESTful واستجابات JSON/XML. يوفر نماذج بيانات موحدة للمرضى والملاحظات والأدوية وغيرها، مع دعم OAuth 2.0 وSMART على FHIR لدمج التطبيقات. في هذا الدليل، ستجد خطوات عملية لفهم بنية FHIR، أنواعه، البحث والمصادقة، وتنفيذ التكامل في بيئة إنتاجية.
💡 Apidog يبسط تكامل واجهات برمجة تطبيقات الرعاية الصحية: اختبر نقاط نهاية FHIR، تحقق من مخططات الموارد، اكتشف مشاكل المصادقة، ووثّق API في مكان واحد. استورد أدلة التنفيذ بسهولة، استجب بردود وهمية، وشارك سيناريوهات الاختبار مع فريقك.
ما هو HL7 FHIR؟
FHIR هو معيار تبادل إلكتروني لمعلومات الرعاية الصحية، طورته HL7، ويعتمد تقنيات ويب حديثة مثل RESTful API, JSON, XML وOAuth 2.0.
أنواع موارد FHIR
FHIR يوفر أكثر من 140 نوع مورد. الأهم للمطورين:
| المورد | الغرض | حالات الاستخدام الشائعة |
|---|---|---|
| المريض | المعلومات الديموغرافية | البحث، التسجيل |
| الممارس الصحي | بيانات مقدم الخدمة | الدليل، الجدولة |
| اللقاء | الزيارات | الفوترة، حلقات الرعاية |
| الملاحظة | البيانات السريرية | العلامات الحيوية، نتائج المختبر |
| الحالة الصحية | التشخيصات | قوائم المشاكل، تخطيط الرعاية |
| طلب الدواء | الوصفات الطبية | الوصفات الإلكترونية، التاريخ الدوائي |
| الحساسية | الحساسيات | التنبيهات، فحص السلامة |
| التطعيم | التطعيمات | سجلات التطعيم |
| تقرير التشخيص | تقارير المختبر | تسليم النتائج |
| مرجع المستند | المستندات السريرية | ملخصات الخروج |
بنية واجهة FHIR
https://fhir-server.com/fhir/{resourceType}/{id}
مقارنة الإصدارات
| الإصدار | الحالة | استخدامات |
|---|---|---|
| R4 (4.0.1) | STU الحالي | الإنتاج |
| R4B (4.3) | تجريبي | متبنون أوائل |
| R5 (5.0.0) | مسودة | مستقبلية |
| DSTU2 | مهمل | أنظمة قديمة |
ملاحظة: تتطلب CMS من السجلات الصحية الإلكترونية دعم FHIR R4.
البدء: الوصول إلى خادم FHIR
الخطوة 1: اختيار خادم FHIR
أشهر الخيارات:
| الخادم | النوع | التكلفة | الأفضل لـ |
|---|---|---|---|
| Azure API for FHIR | مُدار | الدفع حسب الاستخدام | المؤسسات/عملاء Azure |
| AWS HealthLake | مُدار | الدفع حسب الاستخدام | بيئة AWS |
| Google Cloud Healthcare API | مُدار | الدفع حسب الاستخدام | بيئة GCP |
| HAPI FHIR | مفتوح المصدر | مستضاف ذاتيًا | نشر مخصص |
| Epic FHIR Server | تجاري | عملاء Epic | دمج سجلات Epic |
| Cerner Ignite FHIR | تجاري | عملاء Cerner | دمج سجلات Cerner |
الخطوة 2: الحصول على بيانات اعتماد الخادم
لخدمات FHIR السحابية:
# Azure API لـ FHIR
# 1. أنشئ خدمة FHIR في بوابة Azure
# 2. إعداد OAuth 2.0/AAD
# 3. احصل على endpoint: https://{service-name}.azurehealthcareapis.com
# 4. سجل تطبيق العميل
# AWS HealthLake
# 1. أنشئ Data Store من وحدة تحكم AWS
# 2. إعداد IAM Role
# 3. Endpoint: https://healthlake.{region}.amazonaws.com
الخطوة 3: فهم عمليات FHIR RESTful
| العملية | HTTP | نقطة النهاية | الوصف |
|---|---|---|---|
| قراءة | GET | /resourceType/id |
جلب مورد معين |
| بحث | GET | /resourceType?param=value |
البحث عن موارد |
| إنشاء | POST | /resourceType |
مورد جديد |
| تحديث | PUT | /resourceType/id |
استبدال مورد |
| تصحيح | PATCH | /resourceType/id |
تحديث جزئي |
| حذف | DELETE | /resourceType/id |
حذف مورد |
| سجل | GET | /resourceType/id/_history |
إصدارات مورد |
الخطوة 4: اختبار الاتصال
curl -X GET "https://fhir-server.com/fhir/metadata" \
-H "Accept: application/fhir+json" \
-H "Authorization: Bearer {token}"
استجابة متوقعة:
{
"resourceType": "CapabilityStatement",
"status": "active",
"date": "2026-03-25",
"fhirVersion": "4.0.1",
"rest": [{
"mode": "server",
"resource": [
{ "type": "Patient" },
{ "type": "Observation" },
{ "type": "Condition" }
]
}]
}
عمليات FHIR الأساسية
قراءة مورد المريض
const FHIR_BASE_URL = process.env.FHIR_BASE_URL;
const FHIR_TOKEN = process.env.FHIR_TOKEN;
const fhirRequest = async (endpoint, options = {}) => {
const response = await fetch(`${FHIR_BASE_URL}/fhir${endpoint}`, {
...options,
headers: {
'Accept': 'application/fhir+json',
'Authorization': `Bearer ${FHIR_TOKEN}`,
...options.headers
}
});
if (!response.ok) {
const error = await response.json();
throw new Error(`FHIR Error: ${error.issue?.[0]?.details?.text || response.statusText}`);
}
return response.json();
};
// قراءة المريض بواسطة المعرف
const getPatient = async (patientId) => {
const patient = await fhirRequest(`/Patient/${patientId}`);
return patient;
};
// الاستخدام
const patient = await getPatient('12345');
console.log(`Patient: ${patient.name[0].given[0]} ${patient.name[0].family}`);
console.log(`DOB: ${patient.birthDate}`);
console.log(`Gender: ${patient.gender}`);
بنية مورد المريض
{
"resourceType": "Patient",
"id": "12345",
"identifier": [
{
"use": "usual",
"type": {
"coding": [{
"system": "http://terminology.hl7.org/CodeSystem/v2-0203",
"code": "MR"
}]
},
"system": "http://hospital.example.org",
"value": "MRN123456"
}
],
"name": [
{
"use": "official",
"family": "Smith",
"given": ["John", "Michael"]
}
],
"telecom": [
{
"system": "phone",
"value": "555-123-4567",
"use": "home"
},
{
"system": "email",
"value": "john.smith@email.com"
}
],
"gender": "male",
"birthDate": "1985-06-15",
"address": [
{
"use": "home",
"line": ["123 Main Street"],
"city": "Springfield",
"state": "IL",
"postalCode": "62701"
}
]
}
البحث عن الموارد
const searchPatients = async (searchParams) => {
const query = new URLSearchParams();
if (searchParams.name) query.append('name', searchParams.name);
if (searchParams.birthDate) query.append('birthdate', searchParams.birthDate);
if (searchParams.identifier) query.append('identifier', searchParams.identifier);
if (searchParams.gender) query.append('gender', searchParams.gender);
const response = await fhirRequest(`/Patient?${query.toString()}`);
return response;
};
// الاستخدام
const results = await searchPatients({ name: 'Smith', birthDate: '1985-06-15' });
console.log(`Found ${results.total} patients`);
results.entry.forEach(entry => {
const patient = entry.resource;
console.log(`${patient.name[0].family}, ${patient.name[0].given[0]}`);
});
معلمات البحث الشائعة
| المورد | معلمات البحث | مثال |
|---|---|---|
| المريض | الاسم، تاريخ الميلاد، المعرف، الجنس | ?name=Smith&birthdate=1985-06-15 |
| الملاحظة | المريض، الرمز، التاريخ، الفئة، الحالة | ?patient=123&code=8480-6&date=ge2026-01-01 |
| الحالة الصحية | المريض، الحالة، الفئة، تاريخ البدء | ?patient=123&clinical-status=active |
| طلب الدواء | المريض، الحالة، النية، الدواء | ?patient=123&status=active |
| اللقاء | المريض، التاريخ، الحالة، الفئة | ?patient=123&date=ge2026-01-01 |
| تقرير التشخيص | المريض، الفئة، التاريخ، الحالة | ?patient=123&category=laboratory |
معدّلات وبادئات البحث
| المعدّل/البادئة | الوصف | مثال |
|---|---|---|
:exact |
مطابقة تامة | name:exact=Smith |
:contains |
يحتوي على | name:contains=smi |
:missing |
موجود/مفقود | phone:missing=true |
eq |
يساوي | birthdate=eq1985-06-15 |
gt |
أكبر من | birthdate=gt1980-01-01 |
ge |
أكبر أو يساوي | birthdate=ge1980-01-01 |
العمل مع البيانات السريرية
إنشاء ملاحظة (علامة حيوية)
const createObservation = async (observationData) => {
const observation = {
resourceType: 'Observation',
status: 'final',
category: [{ coding: [{ system: 'http://terminology.hl7.org/CodeSystem/observation-category', code: 'vital-signs' }] }],
code: { coding: [{ system: 'http://loinc.org', code: observationData.code, display: observationData.display }] },
subject: { reference: `Patient/${observationData.patientId}` },
effectiveDateTime: observationData.effectiveDate || new Date().toISOString(),
valueQuantity: {
value: observationData.value,
unit: observationData.unit,
system: 'http://unitsofmeasure.org',
code: observationData.ucumCode
},
performer: [{ reference: `Practitioner/${observationData.performerId}` }]
};
const response = await fhirRequest('/Observation', {
method: 'POST',
body: JSON.stringify(observation)
});
return response;
};
// الاستخدام - ضغط الدم الانقباضي
const systolicBP = await createObservation({
patientId: '12345',
code: '8480-6',
display: 'Systolic blood pressure',
value: 120,
unit: 'mmHg',
ucumCode: 'mm[Hg]',
performerId: '67890'
});
console.log(`Observation created: ${systolicBP.id}`);
رموز LOINC شائعة
| الرمز | العرض | الفئة |
|---|---|---|
| 8480-6 | ضغط الدم الانقباضي | vital signs |
| 8462-4 | ضغط الدم الانبساطي | vital signs |
| 8867-4 | معدل ضربات القلب | vital signs |
| 8302-2 | طول الجسم | vital signs |
| 29463-7 | وزن الجسم | vital signs |
| 2339-0 | الجلوكوز | المختبر |
| 4548-4 | HbA1c | المختبر |
إنشاء حالة صحية (قائمة المشاكل)
const createCondition = async (conditionData) => {
const condition = {
resourceType: 'Condition',
clinicalStatus: { coding: [{ system: 'http://terminology.hl7.org/CodeSystem/condition-clinical', code: conditionData.status || 'active' }] },
verificationStatus: { coding: [{ system: 'http://terminology.hl7.org/CodeSystem/condition-ver-status', code: 'confirmed' }] },
category: [{ coding: [{ system: 'http://terminology.hl7.org/CodeSystem/condition-category', code: conditionData.category || 'problem-list-item' }] }],
code: { coding: [{ system: 'http://snomed.info/sct', code: conditionData.sctCode, display: conditionData.display }] },
subject: { reference: `Patient/${conditionData.patientId}` },
onsetDateTime: conditionData.onsetDate,
recordedDate: new Date().toISOString()
};
const response = await fhirRequest('/Condition', {
method: 'POST',
body: JSON.stringify(condition)
});
return response;
};
// إضافة مرض السكري
const diabetes = await createCondition({
patientId: '12345',
sctCode: '44054006',
display: 'Type 2 Diabetes Mellitus',
status: 'active',
category: 'problem-list-item',
onsetDate: '2024-01-15'
});
رموز SNOMED CT شائعة
| الرمز | العرض | الفئة |
|---|---|---|
| 44054006 | داء السكري من النوع 2 | مشكلة |
| 38341003 | ارتفاع ضغط الدم | مشكلة |
| 195967001 | الربو | مشكلة |
| 35489007 | اضطراب اكتئابي | مشكلة |
استرداد أدوية المريض
const getPatientMedications = async (patientId) => {
const response = await fhirRequest(
`/MedicationRequest?patient=${patientId}&status=active`
);
return response;
};
// الاستخدام
const medications = await getPatientMedications('12345');
medications.entry?.forEach(entry => {
const med = entry.resource;
console.log(`${med.medicationCodeableConcept.coding[0].display}`);
console.log(` Dose: ${med.dosageInstruction[0]?.text}`);
console.log(` Status: ${med.status}`);
});
استرداد نتائج المختبر
const getLabValue = async (patientId, loincCode) => {
const params = new URLSearchParams({ patient: patientId, code: loincCode });
const response = await fhirRequest(`/Observation?${params.toString()}`);
return response;
};
// الاستخدام - نتائج HbA1c
const hba1c = await getLabValue('12345', '4548-4');
hba1c.entry?.forEach(entry => {
const obs = entry.resource;
console.log(`HbA1c: ${obs.valueQuantity.value} ${obs.valueQuantity.unit}`);
console.log(`Date: ${obs.effectiveDateTime}`);
});
OAuth 2.0 وSMART على FHIR
فهم المصادقة (OAuth 2.0)
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Client │───▶│ Auth │───▶│ FHIR │
│ (App) │ │ Server │ │ Server │
└─────────────┘ └─────────────┘ └─────────────┘
- طلب مصادقة → 2. دخول المستخدم → 3. رمز مصادقة → 4. طلب رمز وصول → 5. رمز + معرف → 6. طلب API → 7. بيانات FHIR
إطلاق تطبيق SMART
const crypto = require('crypto');
class SMARTClient {
constructor(config) {
this.clientId = config.clientId;
this.redirectUri = config.redirectUri;
this.issuer = config.issuer;
this.scopes = config.scopes;
}
generatePKCE() {
const codeVerifier = crypto.randomBytes(32).toString('base64url');
const codeChallenge = crypto.createHash('sha256').update(codeVerifier).digest('base64url');
return { codeVerifier, codeChallenge };
}
buildAuthUrl(state, patientId = null) {
const { codeVerifier, codeChallenge } = this.generatePKCE();
this.codeVerifier = codeVerifier;
const params = new URLSearchParams({
response_type: 'code',
client_id: this.clientId,
redirect_uri: this.redirectUri,
scope: this.scopes.join(' '),
state: state,
code_challenge: codeChallenge,
code_challenge_method: 'S256',
aud: this.issuer,
launch: patientId ? `patient-${patientId}` : null
});
return `${this.issuer}/authorize?${params.toString()}`;
}
async exchangeCodeForToken(code) {
const response = await fetch(`${this.issuer}/token`, {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: new URLSearchParams({
grant_type: 'authorization_code',
code: code,
redirect_uri: this.redirectUri,
client_id: this.clientId,
code_verifier: this.codeVerifier
})
});
const data = await response.json();
return {
accessToken: data.access_token,
refreshToken: data.refresh_token,
expiresIn: data.expires_in,
patientId: data.patient,
encounterId: data.encounter
};
}
}
// الاستخدام
const smartClient = new SMARTClient({
clientId: 'my-app-client-id',
redirectUri: 'https://myapp.com/callback',
issuer: 'https://fhir.epic.com',
scopes: [
'openid',
'profile',
'patient/Patient.read',
'patient/Observation.read',
'patient/Condition.read',
'patient/MedicationRequest.read',
'offline_access'
]
});
const state = crypto.randomBytes(16).toString('hex');
const authUrl = smartClient.buildAuthUrl(state);
console.log(`Redirect to: ${authUrl}`);
نطاقات SMART المطلوبة
| النطاق | الإذن | حالات الاستخدام |
|---|---|---|
openid |
مصادقة OIDC | مطلوب |
profile |
بيانات المستخدم | دليل مقدمي الخدمة |
patient/Patient.read |
قراءة بيانات المريض | البحث عن مريض |
patient/Observation.read |
قراءة الملاحظات | العلامات الحيوية، المختبرات |
patient/Condition.read |
قراءة الحالات الصحية | قائمة المشاكل |
patient/MedicationRequest.read |
قراءة الأدوية | تاريخ الأدوية |
patient/*.read |
كل بيانات المريض | بيانات كاملة |
user/*.read |
كل الموارد المتاحة | مقدم الخدمة |
offline_access |
تحديث الرمز | جلسات طويلة |
إجراء طلبات FHIR موثقة
class FHIRClient {
constructor(accessToken, fhirBaseUrl) {
this.accessToken = accessToken;
this.baseUrl = fhirBaseUrl;
}
async request(endpoint, options = {}) {
const response = await fetch(`${this.baseUrl}/fhir${endpoint}`, {
...options,
headers: {
'Accept': 'application/fhir+json',
'Authorization': `Bearer ${this.accessToken}`,
...options.headers
}
});
if (!response.ok) {
const error = await response.json();
throw new Error(`FHIR Error: ${error.issue?.[0]?.details?.text}`);
}
return response.json();
}
async getPatient(patientId) {
return this.request(`/Patient/${patientId}`);
}
async searchPatients(params) {
const query = new URLSearchParams(params);
return this.request(`/Patient?${query.toString()}`);
}
}
// بعد المصادقة
const fhirClient = new FHIRClient(tokens.accessToken, 'https://fhir.epic.com');
const patient = await fhirClient.getPatient(tokens.patientId);
عمليات الدفعة والمعاملات
طلبات الدفعة (Batch)
const batchRequest = async (requests) => {
const bundle = {
resourceType: 'Bundle',
type: 'batch',
entry: requests.map(req => ({
resource: req.resource,
request: {
method: req.method,
url: req.url
}
}))
};
const response = await fhirRequest('', {
method: 'POST',
body: JSON.stringify(bundle)
});
return response;
};
// مثال: جلب موارد متعددة
const bundle = await batchRequest([
{ method: 'GET', url: 'Patient/12345' },
{ method: 'GET', url: 'Patient/12345/Observation?category=vital-signs' },
{ method: 'GET', url: 'Patient/12345/Condition?clinical-status=active' }
]);
bundle.entry.forEach((entry, index) => {
console.log(`Response ${index}: ${entry.response.status}`);
console.log(entry.resource);
});
طلبات المعاملات (Transaction)
const transactionRequest = async (requests) => {
const bundle = {
resourceType: 'Bundle',
type: 'transaction',
entry: requests.map(req => ({
resource: req.resource,
request: {
method: req.method,
url: req.url
}
}))
};
const response = await fhirRequest('', {
method: 'POST',
body: JSON.stringify(bundle)
});
return response;
};
// إنشاء مريض وحالته الصحية
const transaction = await transactionRequest([
{
method: 'POST',
url: 'Patient',
resource: {
resourceType: 'Patient',
name: [{ family: 'Doe', given: ['Jane'] }],
gender: 'female',
birthDate: '1990-01-01'
}
},
{
method: 'POST',
url: 'Condition',
resource: {
resourceType: 'Condition',
clinicalStatus: { coding: [{ code: 'active' }] },
code: { coding: [{ system: 'http://snomed.info/sct', code: '38341003' }] },
subject: { reference: 'Patient/-1' }
}
}
]);
الاشتراكات وWebhooks
اشتراكات FHIR (R4B+)
const createSubscription = async (subscriptionData) => {
const subscription = {
resourceType: 'Subscription',
status: 'requested',
criteria: subscriptionData.criteria,
reason: subscriptionData.reason,
channel: {
type: 'rest-hook',
endpoint: subscriptionData.endpoint,
payload: 'application/fhir+json'
}
};
const response = await fhirRequest('/Subscription', {
method: 'POST',
body: JSON.stringify(subscription)
});
return response;
};
// الاشتراك في نتائج المختبر الجديدة
const subscription = await createSubscription({
criteria: 'DiagnosticReport?category=laboratory&patient=12345',
reason: 'Monitor patient lab results',
endpoint: 'https://myapp.com/webhooks/fhir'
});
التعامل مع Webhooks
const express = require('express');
const app = express();
app.post('/webhooks/fhir', express.json({ type: 'application/fhir+json' }), async (req, res) => {
const notification = req.body;
if (notification.subscription !== expectedSubscription) {
return res.status(401).send('Unauthorized');
}
if (notification.event?.resourceType === 'DiagnosticReport') {
const reportId = notification.event.resourceId;
const report = await fhirRequest(`/DiagnosticReport/${reportId}`);
await processLabResult(report);
}
res.status(200).send('OK');
});
استكشاف المشاكل الشائعة وإصلاحها
401 غير مصرح به
حلول:
- تأكد من صلاحية الرمز.
- تحقق من نطاق الرمز.
- وجود ترويسة Authorization صحيحة.
- تحقق من تطابق Audience.
403 ممنوع
حلول:
- تحقق من صلاحيات المستخدم.
- تحقق من سياق المريض.
- تحقق من النطاقات المطلوبة.
- تحقق من ضوابط الوصول.
404 غير موجود
حلول:
- تحقق من معرف المورد.
- تحقق من عنوان URL الأساسي.
- تحقق من دعم المورد على الخادم.
- تحقق من إصدار FHIR.
422 كيان غير قابل للمعالجة
const error = await response.json();
error.issue?.forEach(issue => {
console.log(`Severity: ${issue.severity}`);
console.log(`Location: ${issue.expression?.join('.')}`);
console.log(`Message: ${issue.details?.text}`);
});
أسباب شائعة:
- نقص حقول مطلوبة
- رموز غير صالحة
- تنسيق مرجعي خاطئ
- مشاكل في تنسيق التاريخ
قائمة التحقق من النشر في الإنتاج
- [ ] تكوين OAuth 2.0 وSMART على FHIR
- [ ] تحديث الرمز تلقائياً
- [ ] معالجة الأخطاء بشكل مناسب
- [ ] تسجيل ومراقبة بدون بيانات صحية حساسة
- [ ] تحديد معدل الطلبات
- [ ] منطق إعادة المحاولة مع تراجع أسي
- [ ] اختبار مع مزودي EHR متعددين
- [ ] التحقق عبر مدقق FHIR
- [ ] توثيق العمليات
- [ ] إعداد المراقبة والتنبيه
- [ ] دليل تشغيل للمشاكل الشائعة
التحقق من صحة FHIR
const { FhirValidator } = require('fhir-validator');
const validator = new FhirValidator('4.0.1');
const validateResource = async (resource) => {
const validationResult = await validator.validate(resource);
if (!validationResult.valid) {
validationResult.issues.forEach(issue => {
console.error(`Validation Error: ${issue.message}`);
console.error(`Location: ${issue.path}`);
});
throw new Error('Resource validation failed');
}
return true;
};
// تحقق من صحة المورد قبل الإرسال
await validateResource(patientResource);
حالات الاستخدام الواقعية
دمج بوابة المرضى
- تحدي: لا يمكن للمرضى الوصول لسجلاتهم من مزودين متعددين
- حل: تطبيق SMART على FHIR مع دمج Epic وCerner
- نتيجة: 80% تبني المرضى، انخفاض 50% في طلبات السجلات
خطوات التنفيذ:
- إطلاق تطبيق SMART للمريض
- أذونات قراءة Patient, Observation, Condition, MedicationRequest
- تحديث الرمز تلقائياً
- واجهة مستخدم متجاوبة
دعم القرار السريري
- تحدي: فقدان فرص الرعاية الوقائية
- حل: استعلامات FHIR بفجوات الرعاية في الوقت الفعلي
- نتيجة: تحسن 25% في درجات HEDIS
خطوات التنفيذ:
- تطبيق SMART لمقدمي الخدمة
- استعلام موارد Patient, Condition, Observation, Immunization
- حساب فجوات الرعاية
- توصيات ضمن سير العمل
تحليلات صحة السكان
- تحدي: بيانات غير مكتملة عبر الشبكات
- حل: تصدير بيانات FHIR بكميات كبيرة ($export)
- نتيجة: رؤية شاملة، تقليل التكاليف
خطوات التنفيذ:
- تصدير بيانات FHIR ليلياً
- استيراد لمستودع بيانات
- نماذج تقسيم المخاطر
- تنبيهات مدير الرعاية
الخلاصة
- FHIR R4 هو معيار تكامل واجهات برمجة تطبيقات الرعاية الصحية
- SMART على FHIR يتيح مصادقة OAuth 2.0 آمنة
- أنواع الموارد توحد بيانات المرضى والملاحظات والحالات الصحية والأدوية
- معلمات البحث تدعم استعلامات مرنة
- عمليات الدفعة والمعاملة لسيناريوهات سير العمل المتقدمة
- Apidog يبسط اختبار وتوثيق واجهات FHIR
قسم الأسئلة الشائعة
ما هو استخدام HL7 FHIR؟
يوحد FHIR تبادل بيانات الرعاية الصحية بين الأنظمة (EHR، بوابة المريض، تطبيقات الهاتف، إلخ). حالات الاستخدام: بوابات المرضى، دعم القرار السريري، صحة السكان، تنسيق الرعاية.
كيف أبدأ باستخدام FHIR؟
استخدم خادم FHIR عام (مثل HAPI FHIR) أو أطلق خدمة FHIR سحابية (Azure، AWS HealthLake)، وابدأ بقراءة الموارد وتجربة البحث.
ما الفرق بين HL7 v2 وFHIR؟
HL7 v2 يعتمد رسائل (ADT, ORM, ORU)، في حين FHIR RESTful مع JSON/XML، وهو أسهل وأكثر مرونة لتطبيقات الويب والجوال.
هل FHIR متوافق مع HIPAA؟
FHIR معيار بيانات فقط. التوافق يعتمد على التنفيذ: تشفير، مصادقة، ضوابط وصول. يوصى باستخدام OAuth 2.0 مع SMART على FHIR.
ما هي نطاقات SMART؟
تحدد النطاقات الأذونات الدقيقة (مثلاً: patient/Observation.read). امنح تطبيقك أقل صلاحيات مطلوبة.
كيف أبحث عن الموارد في FHIR؟
باستخدام GET ومعلمات البحث: /Patient?name=Smith&birthdate=ge1980-01-01. يدعم FHIR معدّلات وبادئات للبحث المتقدم.
ما هو Bulk FHIR؟
يسمح Bulk FHIR ($export) بتصدير بيانات ضخمة بصيغة NDJSON. مناسب لتحليلات صحة السكان والتكامل مع مستودعات البيانات.
كيف أتعامل مع إصدارات FHIR؟
حدد إصدار FHIR (R4 مفضل)، واستخدم نقاط نهاية واضحة للإصدار. تحقق من CapabilityStatement.
هل يمكنني توسيع FHIR بحقول مخصصة؟
نعم. استخدم "الامتدادات" لتعريف عناصر بيانات مخصصة، ووضّحها في دليل التنفيذ الخاص بك.
ما الأدوات التي تساعد في تطوير FHIR؟
من أهم الأدوات: HAPI FHIR (خادم مفتوح المصدر)، FHIR validator، مجموعات Postman، Apidog لاختبار وتوثيق واجهات API.

Top comments (0)