文章
· 3 hr 前 阅读大约需 4 分钟

使用IRIS互操作生产环境创建FHIR响应

当我们在 IRIS 中创建 FHIR 资源库时,我们有一个端点来访问信息、创建新资源等。但 FHIR 中有些资源可能不会出现在我们的资源库中,例如二进制资源(该资源返回文档,如 PDF)。

我创建了一个例子,当请求二进制资源时,FHIR 端点会返回一个响应,就像它存在于资源库中一样。

首先,我们需要一个命名空间和一个 FHIR 端点。然后,我们需要配置一个将连接到 FHIR 端点的互操作生产环境。该生产环境必须包含以下项目:

  • 业务操作:
    • HS.Util.Trace.Operations(事实上这是可选项,但非常有用)
    • HS.FHIRServer.Interop. OperationTraceOperations属性设置为 *FULL*
  • 业务服务:
    • HS.FHIRServer.Interop.ServiceTraceOperations属性设置为 *FULL*,目标配置名称设置为 HS.FHIRServer.Interop.Operation名称

生产环境如下所示:

创建此生产环境后,我们需要将其与FHIR端点连接。因此,编辑FHIR端点并将Service Config Name参数设置为业务服务(Business Process的名称:

现在,如果我们开始向 FHIR 资源库发送请求,就会在消息查看器(Message Viewer中看到所有跟踪信息:

现在,我们可以通过业务流程来控制如何处理特定路径。

在这个例子中,我们有一个业务流程来接收每个请求(现在业务服务连接到了这个业务流程,而不是业务操作),还有 2 个新的业务操作来执行稍后将解释的其他操作:

让我们来看看名为FHIRRouter 的业务流程:

如果我们查看一下,就会发现如果RequestPath包含 "Binary/",我们就会对该请求进行处理:生成我们自定义的二进制响应。否则,我们将直接把请求发送到 FHIR 资源库。

让我们来看看名为 "生成二进制 "的序列:

首先,我们创建一个HS.FHIRServer.Interop.Response 的新实例。然后从请求路径中获取文档 ID。如何获取?每次有人需要二进制资源时,都必须在 URL 路径中请求文档的 ID,比如:..../fhir/r4/Binary/XXXXX。因此,我们使用以下表达式从请求路径中提取文档 ID:

$Replace(request.Request.RequestPath,"Binary/","")

(虽然不是很优雅,但还是可以用的)。

如果有了文档 ID,我们就会调用名为 "查找(Find)" 的业务操作来查找与该文档 ID 相关的文件名:

事实上,"查找(Find)"业务操作总是返回相同的文件名:

这是我们能做什么的一个例子。

如果我们有一个文件名,那么就可以调用另一个名为File业务操作来获取以 base64 编码的文件内容:

最后,我们可以返回两种响应:

  • 如果没有文件内容(因为没有文件 ID 或找不到相关的文件名或内容),我们会返回404 响应,并给出自定义响应:
 set json = {
    "resourceType": "OperationOutcome",
    "issue": [
        {
            "severity": "error",
            "code": "not-found",
            "diagnostics": "<HSFHIRErr>ResourceNotFound",
            "details": {
                "text": "No resource with type 'Binary'"
            }
        }
    ]
 }
 set json.issue.%Get(0).details.text = json.issue.%Get(0).details.text_" and id '"_context.docId_"'"
 set qs = ##class(HS.SDA3.QuickStream).%New()
 do qs.Write(json.%ToJSON())
 set response.QuickStreamId = qs.%Id()
 set response.ContentType = "application/fhir+json"
 set response.CharSet = "UTF-8"
  • 如果有文件内容,则返回200 响应,并附带以下自定义响应:
 set json = {
  "resourceType": "Binary",
  "id": "",
  "contentType": "application/pdf",
  "securityContext": {
    "reference": "DocumentReference/"
  },
  "data": ""
 }
 set json.id = context.docId
 set json.securityContext.reference = json.securityContext.reference_json.id
 set json.data = context.content.Read(context.content.Size)
 
 set qs = ##class(HS.SDA3.QuickStream).%New()
 do qs.Write(json.%ToJSON())
 set response.QuickStreamId = qs.%Id()
 set response.ContentType = "application/fhir+json"
 set response.CharSet = "UTF-8"

这里的关键是创建一个包含 JSON 对象的HS.SDA3.QuickStream。并将此 QuickStream 添加到响应中。

现在,如果我们测试我们的端点,如果我们请求二进制文档,我们将看到响应:

如果我们请求一个不存在的二进制文档(可以通过不输入文档 ID 进行测试),我们将看到 404 响应:

总之,将我们的 FHIR 端点与互操作性连接起来,我们就可以利用 InterSystems IRIS 的所有功能做任何我们想做的事情。

讨论 (0)1
登录或注册以继续