本页面介绍了如何通过执行 FHIR 软件包来管理 FHIR 资源,软件包是 FHIR 资源以及对这些 FHIR 资源执行的操作的集合。
ExecuteBundle
方法实现 FHIR 标准批处理/事务交互(DSTU2、STU3 和 R4)。
FHIR 软件包
FHIR 软件包包含一组条目,每个条目代表对资源(如观察或患者)的操作,例如创建、更新或删除。请参阅软件包资源中元素的详细说明。
当您执行 FHIR 软件包时,软件包类型决定了该软件包中的操作的执行方式。可用的软件包类型如下:
batch
:将操作作为多个独立请求执行。transaction
:将操作作为多个相互依赖的请求执行。
例如,假设事务包包含创建患者资源和观察结果资源。如果患者资源创建请求失败,则不会创建观察结果资源。
如果软件包类型为 batch
时操作失败,则 Cloud Healthcare API 会继续执行软件包中的其余操作。如果软件包类型为 transaction
时操作失败,则 Cloud Healthcare API 将停止执行操作并回滚事务。
授予执行软件包的权限
执行软件包要求 datasets.fhirStores.fhir.executeBundle
权限。要授予此权限,请使用 healthcare.fhirResourceReader
角色。如需了解授予此权限的步骤,请参阅修改政策。
Cloud Healthcare API 会检查软件包中每项操作的权限。如果您拥有 healthcare.fhirResources.create
权限但没有 healthcare.fhirResources.update
权限,则只能执行包含 healthcare.fhirResources.create
操作的软件包。
执行软件包
要执行 FHIR 软件包,请使用 projects.locations.datasets.fhirStores.fhir.executeBundle
方法。
在以下示例中,BUNDLE.json 是 JSON 编码的 FHIR 软件包的路径和文件名。您还可以在请求正文中包含该软件包。
以下示例软件包会创建一个患者资源并删除另一个患者资源:
{
"resourceType": "Bundle",
"id": "bundle-transaction",
"meta": {
"lastUpdated": "2018-03-11T11:22:16Z"
},
"type": "transaction",
"entry": [
{
"resource": {
"resourceType": "Patient",
"name": [
{
"family": "Smith",
"given": [
"Darcy"
]
}
],
"gender": "female",
"address": [
{
"line": [
"123 Main St."
],
"city": "Anycity",
"state": "CA",
"postalCode": "12345"
}
]
},
"request": {
"method": "POST",
"url": "Patient"
}
},
{
"request": {
"method": "DELETE",
"url": "Patient/1234567890"
}
}
]
}
以下示例展示了如何执行软件包。
curl
要执行软件包,请发出 POST
请求并指定以下信息:
- 父数据集和 FHIR 存储区的名称和位置
- 软件包文件在本地机器上的位置
- 访问令牌
以下示例展示了使用 curl 的 POST
请求:
curl -X POST \ -H "Content-Type: application/fhir+json; charset=utf-8" \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ --data @BUNDLE_FILE.json \ "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir"
无论各个操作的结果如何,在执行批处理软件包后,服务器都会返回类型为 batch-response
的 Bundle
资源的 JSON 编码表示。Bundle
资源包含请求中每个条目的一个条目以及该条目的处理结果,可能既有成功结果又有错误结果。
如果事务包成功,服务器会返回类型为 transaction-response
的 Bundle
资源的 JSON 编码表示,其中包含请求中每个条目的一个条目,以及操作的成功结果。
如果在执行事务包时发生错误,则响应正文不会包含软件包。相反,它会包含 JSON 编码的 OperationOutcome
资源,用于描述错误的原因。响应中不会报告已回滚的成功操作。
以下示例包是成功执行上述示例的输出。第一个条目表示创建患者的操作成功,并包含新资源的 ID。第二个条目表示删除操作成功。
{ "entry": [ { "response": { "location": projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/RESOURCE/RESOURCE_ID, "status": "201 Created" } }, { "response": { "status": "200 OK" } } ], "resourceType": "Bundle", "type": "transaction-response" }
PowerShell
要执行软件包,请发出 POST
请求并指定以下信息:
- 父数据集和 FHIR 存储区的名称和位置
- 软件包文件在本地机器上的位置
- 访问令牌
以下示例展示了使用 Windows PowerShell 的 POST
请求:
$cred = gcloud auth application-default print-access-token $headers = @{ Authorization = "Bearer $cred" } Invoke-RestMethod ` -Method Post ` -Headers $headers ` -ContentType: "application/fhir+json" ` -InFile BUNDLE_FILE.json ` -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir" | ConvertTo-Json
无论各个操作的结果如何,在执行批处理软件包后,服务器都会返回类型为 batch-response
的 Bundle
资源的 JSON 编码表示。Bundle
资源包含请求中每个条目的一个条目以及该条目的处理结果,可能既有成功结果又有错误结果。
如果事务包成功,服务器会返回类型为 transaction-response
的 Bundle
资源的 JSON 编码表示,其中包含请求中每个条目的一个条目,以及操作的成功结果。
如果在执行事务包时发生错误,则响应正文不会包含软件包。相反,它会包含 JSON 编码的 OperationOutcome
资源,用于描述错误的原因。响应中不会报告已回滚的成功操作。
以下示例包是成功执行上述示例的输出。第一个条目表示创建患者的操作成功,并包含新资源的 ID。第二个条目表示删除操作成功。
{ "entry": [ { "response": { "etag": "ETAG", "lastModified": "2020-08-03T04:12:47.312669+00:00", "location": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/RESOURCE/RESOURCE_ID", "status": "201 Created" } }, { "response": { "etag": "ETAG", "lastModified": "2020-08-03T04:12:47.312669+00:00", "status": "200 OK" } } ], "resourceType": "Bundle", "type": "transaction-response" }
Go
Java
Node.js
代码示例的 GitHub 代码库中提供了一个示例软件包文件。
Python
代码示例的 GitHub 代码库中提供了一个示例软件包文件。
发出 PATCH
请求
您可以使用 FHIR 软件包对 FHIR 资源发出 JSON PATCH
请求。如需了解详情,请参阅在 FHIR 软件包中执行 PATCH
请求。
解析对软件包中创建的资源的引用
事务包中的资源可以包含对目标系统中不存在、但在软件包执行期间创建的资源的引用。Cloud Healthcare API 使用 entry.fullUrl
字段解析资源之间的关联。与软件包中其他资源的 entry.fullUrl
值匹配的引用将被重写为存储区中相应资源的 ID。无论软件包中操作的顺序如何,此行为都会成功。
Cloud Healthcare API 接受以下格式的 fullUrl
:
urn:uuid:UUID
urn:oid:OID
- 任意网址
- 采用
RESOURCE_TYPE/RESOURCE_ID
格式的资源名称,例如Patient/123
。不建议使用此格式,因为fullUrl
是软件包的本地占位符。如果存储区中的资源具有相同的名称,但包中的资源因创建操作而解析为其他名称,这可能会引起混淆。
以下示例软件包创建了一个患者资源和一个引用该患者资源的观察结果资源。
{
"resourceType": "Bundle",
"type": "transaction",
"entry":[
{
"request": {
"method":"POST",
"url":"Patient"
},
"fullUrl": "urn:uuid:05efabf0-4be2-4561-91ce-51548425acb9",
"resource": {
"resourceType":"Patient",
"gender":"male"
}
},
{
"request": {
"method":"POST",
"url":"Observation"
},
"resource": {
"resourceType":"Observation",
"subject": {
"reference": "urn:uuid:05efabf0-4be2-4561-91ce-51548425acb9"
},
"status":"preliminary",
"code": {
"text":"heart rate"
}
}
}
]
}
以下示例展示了如何执行软件包。
curl
代码示例的 GitHub 代码库中提供了一个示例软件包文件。
要执行软件包,请发出 POST 请求并指定以下信息:
- 父数据集和 FHIR 存储区的名称和位置
- Cloud Storage 中软件包文件的位置
- 访问令牌
以下示例展示了使用 curl 的 POST
请求:
curl -X POST \ -H "Content-Type: application/fhir+json; charset=utf-8" \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ --data @BUNDLE_FILE.json \ "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir"
以下示例包是成功执行上述示例的输出。第一个条目表示创建患者的操作成功,并包含新资源的 ID。第二个条目表示创建观察结果的操作成功,并包含新资源的 ID。
{ "entry": [ { "response": { "etag": "ETAG1", "lastModified": "2020-08-04T16:14:14.273976+00:00", "location": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/REGION/datasets/REGION/fhirStores/FHIR_STORE_ID/fhir/Patient/PATIENT_ID/_history/HISTORY_ID", "status": "201 Created" } }, { "response": { "etag": "ETAG", "lastModified": "2020-08-04T16:14:14.273976+00:00", "location": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/REGION/datasets/REGION/fhirStores/FHIR_STORE_ID/fhir/Observation/OBSERVATION_ID/_history/HISTORY_ID", "status": "201 Created" } } ], "resourceType": "Bundle", "type": "transaction-response" }
PowerShell
代码示例的 GitHub 代码库中提供了一个示例软件包文件。
要执行软件包,请发出 POST 请求并指定以下信息:
- 父数据集和 FHIR 存储区的名称和位置
- Cloud Storage 中软件包文件的位置
- 访问令牌
以下示例展示了使用 Windows PowerShell 的 POST
请求:
$cred = gcloud auth application-default print-access-token $headers = @{ Authorization = "Bearer $cred" } Invoke-RestMethod ` -Method Post ` -Headers $headers ` -ContentType: "application/fhir+json" ` -InFile BUNDLE_FILE.json ` -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir" | ConvertTo-Json
以下示例包是成功执行上述示例的输出。第一个条目表示创建患者的操作成功,并包含新资源的 ID。第二个条目表示创建观察结果的操作成功,并包含新资源的 ID。
{ "entry": [ { "response": { "etag": "ETAG1", "lastModified": "2020-08-04T16:14:14.273976+00:00", "location": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/REGION/datasets/REGION/fhirStores/FHIR_STORE_ID/fhir/Patient/PATIENT_ID/_history/HISTORY_ID", "status": "201 Created" } }, { "response": { "etag": "ETAG", "lastModified": "2020-08-04T16:14:14.273976+00:00", "location": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/REGION/datasets/REGION/fhirStores/FHIR_STORE_ID/fhir/Observation/OBSERVATION_ID/_history/HISTORY_ID", "status": "201 Created" } } ], "resourceType": "Bundle", "type": "transaction-response" }