本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
删除 FHIR 资源
FHIR delete 交互将现有的 FHIR 资源从 HealthLake数据存储中移除。有关更多信息,请参阅 FHIR R4 RESTful API 文档delete
删除 FHIR 资源
-
收集 HealthLake
region和估datastoreId值。有关更多信息,请参阅 获取数据存储属性。 -
确定
Resource要删除的 FHIR 类型并收集关联id值。有关更多信息,请参阅 资源类型。 -
使用收集的 HealthLake
region和值构造请求的 URLdatastoreId。还包括 FHIRResource类型及其相关id类型。要查看以下示例中的整个 URL 路径,请滚动到 “复制” 按钮上。DELETE https://healthlake.region.amazonaws.com/datastore/datastoreId/r4/Resource/id -
发送 请求。FHIR
delete交互使用AWS 签名版本 4 或经 FHIR 授权的 SMARTDELETE请求。以下curl示例从 HealthLake 数据存储中移除现有 FHIRPatient资源。要查看整个示例,请滚动到 “复制” 按钮。
根据条件删除 FHIR 资源
当您不知道具体的 FHIR 资源 ID 但有其他有关要删除的资源的识别信息时,有条件删除尤其有用。
条件删除允许您根据搜索条件而不是按逻辑 FHIR ID 删除现有资源。当服务器处理删除请求时,它使用标准搜索功能对资源类型执行搜索,以解析请求的单一逻辑 ID。
条件删除的工作原理
服务器的操作取决于它找到多少匹配项:
-
无匹配项:服务器尝试进行普通删除并做出相应的响应(不存在的资源为 404 未找到,已删除的资源为 204 无内容)
-
一次匹配:服务器对匹配的资源执行普通删除
-
多个匹配项:返回 412 前提条件失败错误,表明客户端的标准选择性不够
响应场景
AWS HealthLake 使用以下响应模式处理条件删除操作:
成功的操作
-
当您的搜索条件成功识别出单个活动资源时,系统将在完成删除后返回 204 No Content,就像标准删除操作一样。
ID-Based 有条件删除
根据id附加参数(createdAt_tag、或_lastUpdated)执行条件删除时:
-
204 无内容:资源已被删除
-
404 未找到:资源不存在
-
409 冲突:ID 匹配但其他参数不匹配
Non-ID-Based 有条件删除
id未提供或使用createdAt、_tag或以外的参数时_lastUpdated:
-
404 未找到:未找到匹配项
冲突局势
有几种情况会导致 412 前提条件失败的响应:
-
多个资源与您的搜索条件相匹配(条件不够具体)
-
将 ETag 标头与一起使用时出现版本冲突
If-Match -
在搜索和删除操作之间发生资源更新
成功的条件删除示例
以下示例根据特定条件删除患者资源:
DELETE https://healthlake.region.amazonaws.com/datastore/datastoreId/r4/Patient?name=peter&birthdate=2000-01-01&phone=1234567890
此请求删除患者资源,其中:
名字是 “彼得”
出生日期是 2000 年 1 月 1 日
电话号码是 1234567890
最佳实践
-
使用特定的搜索条件来避免多次匹配并防止 412 错误。
-
当需要处理并发修改时,可以考虑使用 ETag 标头进行版本控制。
-
适当处理错误响应:
对于 404:优化搜索条件
对于 412:使标准更具体或解决版本冲突
-
为高并发环境中的时间冲突做好准备,在这些环境中,搜索和删除操作之间可能会修改资源。
使用 _count 在一个请求中删除多个 FHIR 资源
默认情况下,有条件删除要求您的搜索条件完全匹配一种资源。要在单个请求中删除多个匹配的资源,请添加_count查询参数。当_count存在时, HealthLake 将请求作为批处理操作进行处理。它搜索匹配的资源,将其删除,然后返回 HTTP,其类型200为 FHIRbatch-response,其中包含每个资源Bundle的状态。
示例请求
以下请求删除标记的匹配Coverage资源inactive:
DELETE https://healthlake.region.amazonaws.com/datastore/datastoreId/r4/Coverage?_tag=inactive&_count=50
批量响应格式
包含的请求会_count返回 HTTP 200 并带有batch-responseBundle。每个条目都会报告一个匹配资源的结果:
-
204 无内容:资源已删除。
-
412 前提条件失败:另一项操作修改了搜索和删除(版本冲突)之间的资源,因此 HealthLake 未将其删除。再次发送有条件删除会运行新的搜索,并且只有在资源仍然符合您的条件时才会删除该资源。由于搜索结果最终是一致的,因此最近修改的资源可能不会立即出现。
-
403 已禁止:经 FHIR 授权的 SMART 拒绝删除此资源。
与任何 FHIR 搜索一样,匹配和删除资源的顺序遵循基础搜索结果的顺序。除非您在搜索条件中包含该_sort参数,否则搜索并不能保证此顺序。如果您需要分页批量删除的确定顺序,请指定。_sort有关更多信息,请参阅 搜索参数。
在响应中Bundle,同样不能保证入场顺序。使用条目中的location字段将每个条目与其资源进行匹配response,而不是依赖于条目位置。
重要
批量条件删除不是原子的。请求中的某些资源可以删除,而其他资源在同一请求中会返回错误Bundle。务必检查响应中的每个条目状态码,Bundle而不是假设整个请求成功或失败。
重要
当搜索不匹配任何资源时,带的请求会_count返回一个空的 HTTP 200 batch-responseBundle(无条目)。这与不带条件删除不同 _count,后者404 Not Found在没有任何匹配项时返回。
部分成功(版本冲突)
可以在搜索和删除之间修改资源。成功删除的资源返回204;冲突的资源同样Bundle返回412。
{ "resourceType": "Bundle", "type": "batch-response", "entry": [ { "response": { "status": "204", "location": "Coverage/b807f9ff-2872-45df-9325-0b2efe42e554" } }, { "response": { "status": "412", "location": "Coverage/5287b322-d7e5-4688-bd55-022067db4d0f", "outcome": { "resourceType": "OperationOutcome", "issue": [ { "severity": "error", "code": "exception", "diagnostics": "Resource was modified by another operation. Retry the request." } ] } } } ] }
使用分页删除更多匹配项
单个请求最多删除一页匹配项。如果还剩下更多匹配的资源,则响应将Bundle包含一个link带next关系和一个 URL。向该网址发送 HTTP DELETE 请求以删除下一页,然后重复此操作,直到响应中不再包含next链接。必须使用该next链接DELETE(与原始请求相同的方法),而不是GET。
{ "resourceType": "Bundle", "type": "batch-response", "link": [ { "relation": "next", "url": "https://healthlake.us-east-1.amazonaws.com/...<page_token>" } ], "entry": [ { "response": { "status": "204", "location": "Patient/4aeffdc9-6ac5-46ff-be10-bf8bd74dfecc" } } ] }
SMART on FHIR 授权行为
-
删除权限不足:如果调用者可以搜索但缺少删除权限,则请求仍会返回
200并且受影响的资源以403条目形式显示在Bundle(这些资源不会删除任何内容)。 -
read/search 权限不足:如果调用者无法运行基础搜索,则无论删除权限如何,整个请求都会在根级别失败,并显示
OperationOutcome(不Bundle返回)。 -
IAM 授权:IAM 在请求级别评估权限,而不是按资源进行权限评估。调用主体必须获得执行删除和搜索操作的授权(例如,
healthlake:DeleteResource以及适用的搜索操作,因为该操作会运行搜索来查找匹配项)。未经授权的委托人被拒绝了整个请求。
有关在 FHIR 授权上配置 SMART 的更多信息,请参阅SMART on FHIR。
服务配额如何适用
批量条件删除没有自己的服务配额。每个请求使用与其执行的搜索和删除交互相同的现有 HealthLake 配额,因此单个请求会消耗多个配额单位:
-
一次搜索:为了解析匹配的资源,每个请求都执行搜索并消耗搜索(读取)容量,就像标准的 FHIR 搜索一样。
-
每个匹配的资源一次删除:每个被删除的资源消耗删除(写入)容量,与单个删除相同。删除 N 个资源的请求消耗一次搜索和 N 次删除。
-
每个请求的资源:每个请求最多删除一页匹配项(默认页面大小为 100)。要删除更多匹配项,请使用分页。
吞吐量受数据存储的写入容量控制。要在账户的配额限制内管理吞吐量,要么发出更多_count值较小的请求,要么使用更窄的搜索范围和更大的_count值。有关您账户当前的搜索和写入容量限制,请参阅端点和限额。
注意事项
-
_count必须是正整数。通过验证返回非整数或超出范围400 Bad Request的值。OperationOutcome当时_count=1,响应仍然是batch-responseBundle,而不是有条件_count删除时返回的单一资源响应。 -
不支持将
If-Match标头与一起使用_count。包含两个退货的请求400 Bad Request。 -
Bundle请求内部不支持批量条件删除。 -
只有成功删除的资源才会计量。以
412或403状态返回的资源不计入计量。