接口描述
用于在事务
Bundle 中执行条件创建操作。客户端在提交待创建资源的同时,会提供一段搜索条件,服务端会先按该条件查询是否已存在匹配资源,若不存在则创建,若已存在则不再重复创建。该机制适合避免重复写入患者、检验结果等具有自然唯一标识的数据。在事务 Bundle 中,条件创建通过
Bundle.entry.request.ifNoneExist 指定,请求方法仍为 POST。输入参数
参数名称 | 类型 | 是否必填 | 说明 |
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。 |
请求体主要字段说明:
字段 | 类型 | 是否必填 | 说明 |
entry[].resource | Object | 是 | 待创建资源内容。 |
entry[].request.method | String | 是 | 固定为 POST。 |
entry[].request.url | String | 是 | 目标资源类型路径。 |
entry[].request.ifNoneExist | String | 否 | 条件创建搜索表达式。省略时该条目退化为普通创建( POST),不进行条件匹配。 |
说明:
若
ifNoneExist 查询无匹配资源,则执行创建。若查询已有匹配资源,则不重复创建。
条件表达式通常使用业务唯一标识字段,如
identifier。输出参数
接口调用成功后,通常返回 HTTP 状态码
200 OK 或 201 Created,并在响应头中包含内容类型及请求追踪信息,响应体一般为结果 Bundle,包含各条目的执行结果及资源位置。响应头示例说明:
参数名称 | 类型 | 说明 |
Status Code | Integer | 成功时返回 200 OK 或 201 Created。 |
Content-Type | String | 响应体 MIME 类型,通常为 application/fhir+json。 |
x-request-id | String | 请求追踪 ID。 |
响应体主要字段说明:
字段 | 类型 | 说明 |
resourceType | String | 返回资源类型,通常为 Bundle。 |
id | String | 结果 Bundle 的唯一标识,由服务端分配。 |
type | String | 结果 Bundle 类型,事务响应固定为 transaction-response。 |
link | Array | 分页相关链接信息,包含 relation 与 url 字段。 |
entry | Array | 条目执行结果。 |
entry[].response.status | String | 条目执行状态。 |
entry[].response.location | String | 新建或匹配资源的位置。 |
entry[].response.etag | String | 条目对应资源的版本标识。 |
示例
请求示例
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": "POST","url": "Patient","ifNoneExist": "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": "POST","url": "Condition","ifNoneExist": "Condition?identifier=http://acme.org/cond|46253"}}]}
响应示例
HTTP/1.1 200 OKContent-Type: application/fhir+jsonx-request-id: <REQUEST_ID>
{"resourceType": "Bundle","id": "d139061a-6078-4670-85f7-f4598e571ec7","type": "transaction-response","link": [{"relation": "self","url": "https://HOSTNAME/INSTANCE_ID/fhir"}],"entry": [{"response": {"status": "201 Created","location": "https://HOSTNAME/INSTANCE_ID/fhir/Patient/95dbbf93-5829-46ba-9021-2545a1da3aa5/_history/1","etag": "W/\\"1\\""}},{"response": {"status": "201 Created","location": "https://HOSTNAME/INSTANCE_ID/fhir/Condition/124ff3c8-f251-4bd9-8c44-cc6568180eae/_history/1","etag": "W/\\"1\\""}}]}
错误码
错误码 | 说明 |
400 Bad Request | 条件创建表达式格式错误 |
401 Unauthorized | 未认证,缺少有效身份凭证 |
403 Forbidden | 已认证但无执行 Bundle 操作的权限 |
409 Conflict | 匹配结果不唯一或资源状态冲突 |
412 Precondition Failed | 条件创建搜索表达式匹配到多条资源,无法确定唯一目标 |
422 Unprocessable Entity | Bundle 语法正确,但未通过业务或规则校验 |
500 Internal Server Error | 服务端内部处理异常 |