接口描述
用于在事务
Bundle 中执行条件更新操作。客户端提交资源内容时,不直接指定目标资源 ID,而是提供一段搜索条件;服务端先根据该条件查询目标资源,再决定执行更新或创建。条件更新的处理规则通常如下:
若无匹配资源,则创建新资源
若存在匹配资源,则使用
Bundle.entry.resource 中的内容更新该资源在事务 Bundle 中,请求方法通常为
PUT,搜索表达式放在 Bundle.entry.request.url 中。输入参数
参数名称 | 类型 | 是否必填 | 说明 |
HTTP Method | String | 是 | 固定为 POST。 |
URL | String | 是 | Bundle 提交地址,格式为 [baseUrl]。 |
Authorization | String | 是 | 身份认证令牌,格式为 Bearer <AccessToken>,AccessToken 通过 调用方式 中的 GetAccessToken 接口获取(实例控制台场景可通过 GetWebAccessToken 接口获取)。 |
Content-Type | String | 否 | 请求体 MIME 类型,写入类请求通常为 application/fhir+json;未指定时服务端将根据请求内容自动推断。 |
Request Body | JSON Object | 是 | 包含条件更新条目的事务 Bundle。 |
请求 URL 示例:
https://HOSTNAME/INSTANCE_ID/fhir
请求体主要字段说明:
字段 | 类型 | 是否必填 | 说明 |
entry[].resource | Object | 是 | 待更新资源内容 |
entry[].request.method | String | 是 | 固定为 PUT |
entry[].request.url | String | 是 | 条件更新搜索表达式 |
说明:
条件更新不直接写死资源 ID,而是通过搜索条件定位目标资源。
若匹配结果为空,则通常按创建处理。
若匹配结果唯一,则对该资源执行更新。
输出参数
接口调用成功后,返回 HTTP 状态码
200 OK,并在响应头中包含内容类型及请求追踪信息,响应体为结果 Bundle,包含各条目的执行状态与资源位置。响应头示例说明:
参数名称 | 类型 | 说明 |
Status Code | Integer | 成功时返回 200 OK。 |
Location | String | 结果 Bundle 的访问地址。 |
Content-Location | String | 结果 Bundle 的内容定位地址。 |
Content-Type | String | 响应体 MIME 类型,通常为 application/fhir+json。 |
x-request-id | String | 请求追踪 ID。 |
响应体主要字段说明:
字段 | 类型 | 说明 |
resourceType | String | 返回资源类型,通常为 Bundle。 |
id | String | 结果 Bundle 的唯一 ID。 |
type | String | Bundle 类型,条件更新返回 transaction-response。 |
link | Array | 导航链接,包含 relation 与 url 字段,relation 为 self 时指向当前请求地址。 |
entry | Array | 条目执行结果。 |
entry[].response.status | String | 条目执行状态。匹配到已有资源时返回 200 OK;无匹配资源导致新建时返回 201 Created。 |
entry[].response.location | String | 更新后或新建资源的位置。 |
entry[].response.etag | String | 资源版本标识。 |
entry[].response.outcome | Object | 条目执行详情,包含 OperationOutcome 信息。 |
示例
请求示例
POST /INSTANCE_ID/fhir HTTP/1.1Host: HOSTNAMEAuthorization: Bearer YOUR_ACCESS_TOKENContent-Type: application/fhir+json
{"resourceType": "Bundle","type": "transaction","entry": [{"fullUrl": "urn:uuid:95dbbf93-5829-46ba-9021-2545a1da3aa5","resource": {"resourceType": "Patient","identifier": [{"system": "http://acme.org/mrns","value": "013873"}],"name": [{"family": "Simpson","given": ["Homer"]}],"gender": "male"},"request": {"method": "PUT","url": "Patient?identifier=http://acme.org/mrns|013873"}},{"fullUrl": "urn:uuid:124ff3c8-f251-4bd9-8c44-cc6568180eae","resource": {"resourceType": "Condition","identifier": [{"system": "http://acme.org/cond","value": "46253"}],"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"}]},"category": [{"coding": [{"system": "http://terminology.hl7.org/CodeSystem/condition-category","code": "problem-list-item","display": "Problem List Item"}]}],"code": {"coding": [{"system": "http://snomed.info/sct","code": "59621000","display": "Essential hypertension"}]},"subject": {"reference": "urn:uuid:95dbbf93-5829-46ba-9021-2545a1da3aa5"}},"request": {"method": "PUT","url": "Condition?identifier=http://acme.org/cond|46253"}}]}
响应示例
HTTP/1.1 200 OKLocation: https://HOSTNAME/INSTANCE_ID/fhir/Bundle/<bundle-id>Content-Location: https://HOSTNAME/INSTANCE_ID/fhir/Bundle/<bundle-id>Content-Type: application/fhir+jsonx-request-id: <REQUEST_ID>
{"resourceType": "Bundle","id": "<bundle-id>","type": "transaction-response","link": [{"relation": "self","url": "https://HOSTNAME/INSTANCE_ID/fhir"}],"entry": [{"response": {"status": "200 OK","location": "Patient/95dbbf93-5829-46ba-9021-2545a1da3aa5/_history/2","etag": "2"}},{"response": {"status": "200 OK","location": "Condition/124ff3c8-f251-4bd9-8c44-cc6568180eae/_history/2","etag": "2"}}]}
错误码
错误码 | 说明 |
400 Bad Request | 条件更新表达式格式错误 |
401 Unauthorized | 未认证,缺少有效身份凭证 |
403 Forbidden | 已认证但无执行 Bundle 操作的权限 |
409 Conflict | 资源状态冲突 |
412 Precondition Failed | 条件更新搜索条件匹配到多个资源,无法确定唯一更新目标 |
422 Unprocessable Entity | Bundle 语法正确,但未通过业务或规则校验 |
500 Internal Server Error | 服务端内部处理异常 |