FHIR 实现指南和配置文件可确保 FHIR 存储区中的资源符合特定的定义条件。一些实现指南示例包括 US Core 实现指南 4.0.0 和 Carin 蓝色按钮实现指南。
本页面介绍了如何使用 US Core 实现指南 4.0.0 在 R4 FHIR 存储区中定义、配置和使用实现指南及配置文件。
概览
FHIR 配置文件是在基本 FHIR 规范的基础上定义的一组额外规则,用于规定不同医疗保健系统如何处理资源。您可以在 FHIR 存储区中导入和启用 FHIR 配置文件,以确保 FHIR 存储区中的所有资源均满足资源结构和捕获的信息的特定标准。
结构定义和实现指南
通过插入分组到一个或多个实现指南中的一个或多个结构定义,您可以将 FHIR 配置文件导入 FHIR 存储区。使用结构定义来执行以下操作:
- 定义 FHIR 资源中一个字段的限制条件。
- 引用连接代码系统和 FHIR 资源的值集。
您可以使用包含结构定义的实现指南来验证资源,使其与您的第三方软件的用例匹配。
例如,假设您的第三方软件需要遵循美国医疗保险和医疗补助服务中心 (CMS) 互操作性和患者访问最终规则。您的第三方软件需要提供符合 CARIN 配置文件的 Patient Access API。您可以在 FHIR 存储区中导入和启用 CARIN 实现指南,以针对 CARIN 配置文件验证资源。本页面的后续部分将介绍如何导入和启用实现指南。
导入实现指南后,您可以在 FHIR 存储区中启用它以进行 FHIR 资源验证。更新存储区中的 FHIR 资源或添加 FHIR 资源时,Cloud Healthcare API 会验证它是否与实现指南中的结构定义相匹配。如果 FHIR 资源匹配,则 FHIR 资源会添加到存储区。如果 FHIR 资源不符合实现指南中的结构定义,将返回错误消息并拒绝 FHIR 资源。
强制执行数据验证
使用以下方法时,Cloud Healthcare API 会强制执行数据验证:
projects.locations.datasets.fhirStores.fhir.create
projects.locations.datasets.fhirStores.fhir.update
projects.locations.datasets.fhirStores.fhir.patch
projects.locations.datasets.fhirStores.executeBundle
配置文件验证工作流
下图显示了添加或更新 FHIR 资源的验证工作流:
定义 FHIR 配置文件
以下部分介绍如何从第三方软件下载结构定义并配置实现指南。
下载您的结构定义、实现指南和值集
为确保结构定义与您的权威来源一致,您需要从外部来源(例如 FHIR.org 的实现指南注册表)下载结构定义、实现指南或值集。外部来源提供的软件包包含每个实现指南的所有值集、配置文件、扩展程序、页面列表和网址。
例如,如果您的系统使用 US Core 患者资料,您可以下载 US Core 使用的结构定义和实现指南。
Cloud Healthcare API 允许验证以下类型的结构定义规则:
slicing
,支持以下判别器:value
pattern
profile
min/max
type
fixed
pattern
minValue
maxValue
maxLength
binding
,但以下规则除外:ValueSet.compose.include.filter
ValueSet.compose.exclude
配置实现指南
下载结构定义、实现指南和值集后,您必须添加实现指南用于验证 FHIR 资源的配置文件。
要将实现指南添加到 FHIR 存储区,请完成以下步骤:
打开您从第三方软件提供商下载的实现指南文件。
添加以下部分,以包含要由实现指南验证的结构定义:
{ "resourceType": "ImplementationGuide", ... "global": [ { "type": "RESOURCE_TYPE", "profile": "STRUCTURE_DEFINITION_URL" } ] ... }
替换以下内容:
- RESOURCE_TYPE:定义实现指南适用的资源类型。
- STRUCTURE_DEFINITION_URL:配置文件的来源结构定义(例如 US Core 患者配置文件)的网址。
保存实现指南文件。
以下示例展示了为 US Core 实现指南启用的患者和组织配置文件:
"global":[ { "type":"Patient", "profile":"https://hl7.org/fhir/us/core/StructureDefinition/us-core-patient" }, { "type":"Organization", "profile":"https://hl7.org/fhir/us/core/StructureDefinition/us-core-organization" }, ... ]
将实现指南上传到 Cloud Storage
修改实现指南后,您必须将以下文件上传到 Cloud Storage:
- 实现指南
- 结构定义
- 值集
上传后,您可以使用这些文件来验证 FHIR 存储区中的资源。
如需将实现指南上传到 Cloud Storage,请完成以下步骤:
从实现指南中删除 Cloud Healthcare API 中的 FHIR 配置文件未使用的所有文件。
例如,如果您要实现 US Core 实现指南,则可以删除以下文件:
.DS_Store
ig-r4.json
openapi/.index.json
package.json
如需将实现指南、结构定义和值集添加到 Cloud Storage,请运行以下命令:
gsutil cp -r \ PATH_TO_IMPLEMENTATION_GUIDE \ gs://BUCKET/IMPLEMENTATION_GUIDE_DIRECTORY
替换以下内容:
- PATH_TO_IMPLEMENTATION_GUIDE:本地机器上实现指南的路径
- BUCKET/IMPLEMENTATION_GUIDE_DIRECTORY:您在 Cloud Storage 中存储实现指南的存储桶和目录
导入实现指南
如需使用实现指南验证 FHIR 存储区中的配置文件,请将其作为 FHIR 资源导入 FHIR 存储区。
以下示例展示了如何将实现指南导入 FHIR 存储区:
gcloud
要将实现指南作为资源添加到 FHIR 存储区,请运行 gcloud healthcare fhir-stores import gcs
命令:
gcloud healthcare fhir-stores import gcs FHIR_STORE_ID \ --dataset=DATASET_ID \ --gcs-uri='gs://BUCKET/IMPLEMENTATION_GUIDE_DIRECTORY/*' \ --content-structure=resource-pretty
替换以下内容:
- FHIR_STORE_ID:FHIR 存储区 ID
- DATASET_ID:数据集 ID
- BUCKET/IMPLEMENTATION_GUIDE_DIRECTORY:Cloud Storage 存储桶中实现指南的位置
输出如下所示:
Request issued for: [FHIR_STORE_ID] Waiting for operation [OPERATION_ID] to complete...done. name: projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID
在此输出中:
- PROJECT_ID、LOCATION、DATASET_ID:您在方法调用中提供的值
- OPERATION_ID:Cloud Healthcare API 提供的长时间运行的操作的标识符
要查看操作的更多详情,请运行 gcloud healthcare operations describe
命令,并提供响应中的 OPERATION_ID:
gcloud healthcare operations describe OPERATION_ID \ --dataset=DATASET_ID
输出如下所示。如果响应包含 done: true
,则表示操作已完成。否则表示操作仍在运行;请等待几秒钟,然后再次运行 gcloud healthcare operations describe
命令。
done: true metadata: '@type': type.googleapis.com/google.cloud.healthcare.v1.OperationMetadata apiMethodName: google.cloud.healthcare.v1.fhir.FhirService.ImportResources createTime: 'CREATE_TIME' endTime: 'END_TIME' name: projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID response: '@type': type.googleapis.com/google.cloud.healthcare.v1.fhir.rest.ImportResourcesResponse fhirStore: projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID
API
curl
curl -X POST \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "Content-Type: application/json; charset=utf-8" \ --data '{ "contentStructure": "RESOURCE_PRETTY", "gcsSource": { "uri": "gs://BUCKET/IMPLEMENTATION_GUIDE_DIRECTORY/*" } }' "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:import"
替换以下内容:
- BUCKET/IMPLEMENTATION_GUIDE_DIRECTORY:Cloud Storage 存储桶中实现指南的位置
- PROJECT_ID:您的 Google Cloud 项目的 ID
- LOCATION:数据集位置
- DATASET_ID:数据集 ID
- FHIR_STORE_ID:FHIR 存储区 ID
响应如下:
{ "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID" }
在此输出中:
- PROJECT_ID、LOCATION、DATASET_ID:您在方法调用中提供的值
- OPERATION_ID:Cloud Healthcare API 提供的长时间运行的操作的标识符
要跟踪操作的状态,请使用 operations.get
方法:
curl -X GET \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"
替换以下内容:
- PROJECT_ID:您的 Google Cloud 项目的 ID
- LOCATION:数据集位置
- DATASET_ID:数据集 ID
- FHIR_STORE_ID:FHIR 存储区 ID
- OPERATION_ID:从长时间运行的操作返回的 ID
输出如下所示。如果响应包含 "done": true
,则表示操作已完成。否则表示操作仍在运行;请等待几秒钟,然后再次调用 operations.get
方法。
{ "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID", "metadata": { "@type": "type.googleapis.com/google.cloud.healthcare.v1.OperationMetadata", "apiMethodName": "google.cloud.healthcare.v1.fhir.FhirService.ImportResources", "createTime": "CREATE_TIME", "endTime": "END_TIME", "logsUrl": "https://console.cloud.google.com/logs/query/CLOUD_LOGGING_URL", "counter": { "success": "SUCCESS_COUNT" } }, "done": true, "response": { "@type": "type.googleapis.com/google.cloud.healthcare.v1.fhir.rest.ImportResourcesResponse", } }
PowerShell
$cred = gcloud auth application-default print-access-token $headers = @{ Authorization = "Bearer $cred" } Invoke-WebRequest ` -Method Post ` -Headers $headers ` -ContentType: "application/json; charset=utf-8" ` -Body '{ "contentStructure": "RESOURCE_PRETTY", "gcsSource": { "uri": "gs://BUCKET/IMPLEMENTATION_GUIDE_DIRECTORY/*" } }' ` -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:import" | Select-Object -Expand Content
替换以下内容:
- BUCKET/IMPLEMENTATION_GUIDE_DIRECTORY:Cloud Storage 存储桶中实现指南的位置
- PROJECT_ID:您的 Google Cloud 项目的 ID
- LOCATION:数据集位置
- DATASET_ID:数据集 ID
- FHIR_STORE_ID:FHIR 存储区 ID
响应如下:
{ "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID" }
在此输出中:
- PROJECT_ID、LOCATION、DATASET_ID:您在方法调用中提供的值
- OPERATION_ID:Cloud Healthcare API 提供的长时间运行的操作的标识符
要跟踪操作的状态,请使用 operations.get
方法:
$cred = gcloud auth application-default print-access-token $headers = @{ Authorization = "Bearer $cred" } Invoke-WebRequest ` -Method Get ` -Headers $headers ` -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID" | Select-Object -Expand Content
替换以下内容:
- PROJECT_ID:您的 Google Cloud 项目的 ID
- LOCATION:数据集位置
- DATASET_ID:数据集 ID
- FHIR_STORE_ID:FHIR 存储区 ID
- OPERATION_ID:从长时间运行的操作返回的 ID
输出如下所示。如果响应包含 "done": true
,则表示操作已完成。否则表示操作仍在运行;请等待几秒钟,然后再次调用 operations.get
方法。
{ "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID", "metadata": { "@type": "type.googleapis.com/google.cloud.healthcare.v1.OperationMetadata", "apiMethodName": "google.cloud.healthcare.v1.fhir.FhirService.ImportResources", "createTime": "CREATE_TIME", "endTime": "END_TIME", "logsUrl": "https://console.cloud.google.com/logs/query/CLOUD_LOGGING_URL", "counter": { "success": "SUCCESS_COUNT" } }, "done": true, "response": { "@type": "type.googleapis.com/google.cloud.healthcare.v1.fhir.rest.ImportResourcesResponse", } }
上传和导入实现的依赖项
您必须先确保已上传并导入实现指南的所有依赖项,然后才能启用实现指南。依赖项由实现指南中的 dependsOn
参数定义,如下所示:
"dependsOn":[
{
"id":"hl7_fhir_uv_bulkdata",
"uri":"http://hl7.org/fhir/uv/bulkdata/ImplementationGuide/hl7.fhir.uv.bulkdata",
"packageId":"hl7.fhir.uv.bulkdata",
"version":"1.0.1"
},
{
"id":"vsac",
"uri":"http://fhir.org/packages/us.nlm.vsac/ImplementationGuide/us.nlm.vsac",
"packageId":"us.nlm.vsac",
"version":"0.3.0"
}
]
如需上传和导入依赖项,请分别按照将实现指南上传到 Cloud Storage 和导入实现指南中的说明进行操作。
启用实现指南
如需使用实现指南资源验证配置文件,必须启用实现指南。如果您启用多个实现指南,则 Cloud Healthcare API 会尝试针对所有实现指南验证配置文件。FHIR 资源只需要匹配任何已启用的实现指南中的一个配置文件。
Cloud Healthcare API 仅在您启用实现指南时验证。如果您修改并重新启用该实现指南,则 Cloud Healthcare API 会验证修改后的实现指南。
如果您在启用某个实现指南后将其移除,该实现指南会停止生效。
以下示例展示了如何在现有 FHIR 存储区上启用实现指南以验证配置文件:
curl
如需启用实现指南,请发出 PATCH
请求并指定以下信息:
- 父级数据集的名称和位置
- FHIR 存储区的名称
- 将
enabledImplementationGuides
字段设置为实现指南资源的路径
以下示例展示了使用 curl
的 PATCH
请求。
curl -X PATCH \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "Content-Type: application/fhir+json; charset=utf-8" \ --data '{ "validationConfig": { "enabledImplementationGuides": ["IMPLEMENTATION_GUIDE_URL"], "disableProfileValidation": false } }' "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID?updateMask=validationConfig"
替换以下内容:
- IMPLEMENTATION_GUIDE_URL:ImplementationGuide 资源的
url
属性中定义的网址,例如http://hl7.org/fhir/us/core/ImplementationGuide/hl7.fhir.us.core
- PROJECT_ID:您的 Google Cloud 项目的 ID
- LOCATION:数据集位置
- DATASET_ID:数据集 ID
- FHIR_STORE_ID:FHIR 存储区 ID
响应如下:
{ "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID", "validationConfig": { "enabledImplementationGuides": ["IMPLEMENTATION_GUIDE_URL"] } }
PowerShell
如需启用实现指南,请发出 PATCH
请求并指定以下信息:
- 父级数据集的名称和位置
- FHIR 存储区的名称
- 将
enabledImplementationGuides
字段设置为实现指南资源的路径
以下示例展示了使用 Windows PowerShell 的 PATCH
请求。
$cred = gcloud auth application-default print-access-token $headers = @{ Authorization = "Bearer $cred" } Invoke-WebRequest ` -Method Patch ` -Headers $headers ` -ContentType: "application/json; charset=utf-8" ` -Body '{ "validationConfig": { "enabledImplementationGuides": ["IMPLEMENTATION_GUIDE_URL"] } }' ` -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID?updateMask=validationConfig" | Select-Object -Expand Content
替换以下内容:
- IMPLEMENTATION_GUIDE_URL:ImplementationGuide 资源的
url
属性中定义的网址,例如http://hl7.org/fhir/us/core/ImplementationGuide/hl7.fhir.us.core
- PROJECT_ID:您的 Google Cloud 项目的 ID
- LOCATION:数据集位置
- DATASET_ID:数据集 ID
- FHIR_STORE_ID:FHIR 存储区 ID
响应如下:
{ "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID", "validationConfig": { "enabledImplementationGuides": ["IMPLEMENTATION_GUIDE_URL"], }, }
Python
针对特定配置文件验证资源
以下示例展示了如何针对为 FHIR 存储区定义的特定配置文件或所有配置文件验证 FHIR 资源。通过验证 FHIR 资源,您可以确定 FHIR 资源是否符合一个或多个配置文件。
如需验证 FHIR 资源,请使用 fhir.Resource-validate
方法。
curl
curl -X POST \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "Content-Type: application/json; charset=utf-8" \ --data @RESOURCE_FILE \ 'https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/RESOURCE_TYPE/$validate?profile=PROFILE_URL'
替换以下内容:
- RESOURCE_FILE:包含资源的文件的位置
- PROJECT_ID:您的 Google Cloud 项目的 ID
- LOCATION:数据集位置
- DATASET_ID:数据集 ID
- FHIR_STORE_ID:FHIR 存储区 ID
- PROFILE_URL:FHIR 配置文件的规范网址,例如
http://hl7.org/fhir/us/core/StructureDefinition/us-core-patient
,对应于患者资源。FHIR_STORE_ID 中必须包含具有此网址的 StructureDefinition 资源。如果您要针对存储区中已启用的配置文件验证资源,请勿提供此查询参数。 - RESOURCE_TYPE:资源类型
如果资源符合配置文件,则系统会返回类似于以下内容的响应:
{ "issue": [ { "code": "informational", "details": { "text": "success" }, "diagnostics": "success", "severity": "information" } ], "resourceType": "OperationOutcome" }
如果资源不符合配置文件,则系统会返回错误,并显示类似于以下内容的响应:
{ "issue": [ { "code": "processing", "diagnostics": "Profile http://hl7.org/fhir/StructureDefinition/AuditEvent, Element 'AuditEvent.agent.requestor': minimum required = 1, but only found 0", "location": [ "AuditEvent.agent" ], "severity": "error" } ], "resourceType": "OperationOutcome" }
PowerShell
$cred = gcloud auth application-default print-access-token $headers = @{ Authorization = "Bearer $cred" } Invoke-WebRequest ` -Method Post ` -Headers $headers ` -ContentType: "application/json; charset=utf-8" ` -Body '@RESOURCE_FILE' ` -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/RESOURCE_TYPE/$validate?profile=PROFILE_URL" | Select-Object -Expand Content
替换以下内容:
- RESOURCE_FILE:包含资源的文件的位置
- PROJECT_ID:您的 Google Cloud 项目的 ID
- LOCATION:数据集位置
- DATASET_ID:数据集 ID
- FHIR_STORE_ID:FHIR 存储区 ID
- PROFILE_URL:FHIR 配置文件的规范网址,例如
http://hl7.org/fhir/us/core/StructureDefinition/us-core-patient
,对应于患者资源。FHIR_STORE_ID 中必须包含具有此网址的 StructureDefinition 资源。如果您要针对存储区中已启用的配置文件验证资源,请勿提供此查询参数。 - RESOURCE_TYPE:资源类型
如果资源针对配置文件进行了验证,则系统会返回类似于以下内容的响应:
{ "issue": [ { "code": "informational", "details": { "text": "success" }, "diagnostics": "success", "severity": "information" } ], "resourceType": "OperationOutcome" }
如果资源未针对配置文件进行验证,则系统会返回错误,并显示类似于以下内容的响应:
{ "issue": [ { "code": "processing", "diagnostics": "Profile http://hl7.org/fhir/StructureDefinition/AuditEvent, Element 'AuditEvent.agent.requestor': minimum required = 1, but only found 0", "location": [ "AuditEvent.agent" ], "severity": "error" } ], "resourceType": "OperationOutcome" }