搜索​​​​

清除过滤器
文章
Louis Lu · 十二月 24, 2023

接收POST请求的Base64 文件

在此文章中将分享,当使用InterSystems IRIS 做后端时如何接收并保存通过POST方式发送过来的 Base64文件。 前后端之间传输文件,我认为较简单的方式是:前端将文件转为Base64格式,调用POST方法并将Base64内容附加在JSON消息中的一个参数中,在JSON消息中的另一个参数可以是文件名,比如消息定义如下: { "fileData": "JVBERi0xLjQKJdPr6eEKMSAwIG...", "fileName": "example.pdf" } 在IRIS中,可以定义一个web application用于处理POST请求,同时定义一个分派类继承于%CSP.REST,在类中定义一个方法,具体保存文件。 代码示例: ClassMethod SaveFile() As %Status { Try { Do ##class(%REST.Impl).%SetContentType("application/json") If '##class(%REST.Impl).%CheckAccepts("application/json") Do ##class(%REST.Impl).%ReportRESTError(..#HTTP406NOTACCEPTABLE,$$$ERROR($$$RESTBadAccepts)) Quit // Reading the body of the http call with the file data set dynamicBody = {}.%FromJSON(%request.Content) set dynamicStream = dynamicBody.%Get("fileData",,"stream<base64") set stream=##class(%Stream.FileBinary).%New() set sc=stream.LinkToFile("/shared/durable/"_dynamicBody.fileName) set sc=stream.CopyFromAndSave(dynamicStream) } Catch (ex) { Do ##class(%REST.Impl).%SetStatusCode("400") Do ##class(%REST.Impl).%WriteResponse(ex.DisplayString()) return {"errormessage": "Client error"} } Quit $$$OK } 下面具体解释下其中较重要的部分: 获取到请求的消息内容,并将其转化为%Library.DynamicAbstractObject对象,这样我们可以后面通过对象的方式进行处理 set dynamicBody = {}.%FromJSON(%request.Content) 下面是比较重要的一步,我们将Base64 转化为 %Stream 类型,我们可以直接通过%Library.DynamicObject类下面的%Get方法实现 set dynamicStream = dynamicBody.%Get("fileData",,"stream<base64") 要注意的一点是,这里我们完全可以绕过了string 常常遇到的MAXSTRING 错误,因为我们直接将Base64转化为stream. 最后,我们在服务器上创建了一个文件,内容来自传进的Base64,文件名也来自于传入的JSON消息 set stream=##class(%Stream.FileBinary).%New() set sc=stream.LinkToFile("/shared/durable/"_dynamicBody.fileName) set sc=stream.CopyFromAndSave(dynamicStream)
文章
Qiao Peng · 十二月 7, 2023

通用TCP业务服务和业务操作

TCP作为OSI 7层的传输层的通信协议,其使用上不像更上层的通信协议那么方便,因为TCP操作的不是数据包,它操作的是数据流。因此有多种将TCP数据流“解释”为数据包(消息)的方法。 InterSystems IRIS提供了多种TCP适配器,用于不同的“解释”,例如EnsLib.TCP.FramedInboundAdapter使用特定的首尾字符做为分隔、EnsLib.TCP.CountedInboundAdapter使用固定的长度进行分隔... 同时,InterSystems IRIS提供了多种开箱即用的TCP业务服务和业务操作,方便接入和发送TCP数据。这里我们介绍常见的使用特定的首尾字符做为分隔的TCP业务服务和业务操作。 1. 通用TCP业务服务和业务操作 EnsLib.TCP.Framed.PassthroughService和EnsLib.TCP.Framed.PassthroughOperation是一组使用特定的首尾字符做为分隔TCP数据流的通用业务服务和业务操作。EnsLib.TCP.Framed.PassthroughService业务服务会将TCP数据封装在Ens.StreamContainer发送给业务流程或业务操作;而EnsLib.TCP.Framed.PassthroughOperation业务操作发送并接收Ens.StreamContainer类型的数据。 2. 使用EnsLib.TCP.Framed.PassthroughService业务服务 2.1 向production中加入通用TCP业务服务 增加通用TCP业务服务,只需要在Production配置页面的服务中添加EnsLib.TCP.Framed.PassthroughService。 建议加入Production时,给业务服务起一个名字,用于代表具体的业务,例如是连接到设备的TCP服务,可以命名为TCPforDevice(可以考虑的命名规则 - 接口方式+业务系统)。如果未命名,默认会使用类名作为业务服务名。 2.2 配置通用TCP业务服务 主要的设置项是以下几个: 1. Port:接收TCP数据的端口,例如图中的65530端口 2. Target Config Names:TCP服务发送消息的目标,可以是业务流程或业务操作 3. Message Frame Start:标记TCP开始的字符或字符串,用10进制ASCII码表示。如果有多个字符,字符ASCII间用逗号分隔。图例中为ASCII 10,也就是“退格符”。 4. Message Frame End:标记TCP结束的字符或字符串,用10进制ASCII码表示。如果有多个字符,字符ASCII间用逗号分隔。图例中为ASCII 28和13,也就是“文件分隔符”和“回车符”。 5. Remove Framing: 是否把标记TCP起止的字符删除后再发送到后续业务组件。建议选中 6. Discard Incorrect Framing:丢弃使用不正确起始字符的TCP数据。建议在调试阶段取消选中,测试完成后再选中 7. Frame Acknowledgement:是否要发送Frame 通知,可以取消选中 启用该业务服务后,既可以接收了TCP请求了。 2.3 测试通用TCP业务服务 可以使用TCP客户端进行发送数据的测试。这里使用Packet Sender向IRIS发布的65530端口,发送以下的数据,注意前后的TCP分段起止字符: 然后就可以到消息可视化追踪的页面查看接收的消息。可以看到它是Ens.StreamContainer类型的消息,而且已经把起止字符去掉了: 3. 使用EnsLib.TCP.Framed.PassthroughOperation业务操作 3.1 向production中加入通用TCP业务操作 同样,可以直接将EnsLib.TCP.Framed.PassthroughOperation加入production。 3.2 配置通用TCP业务操作 主要的设置项是以下几个: 1. IP Address:TCP服务器的IP地址 2. Port:TCP服务器的TCP端口,例如图中的65530端口。这里用65530端口,就是发送到上面我们建立的通用TCP业务服务。 3. Message Frame Start:标记TCP开始的字符或字符串,用10进制ASCII码表示。如果有多个字符,字符ASCII间用逗号分隔。图例中为ASCII 10,也就是“退格符”。业务操作会自动在发送的TCP数据头部加入这些开始字符。 4. Message Frame End:标记TCP结束的字符或字符串,用10进制ASCII码表示。如果有多个字符,字符ASCII间用逗号分隔。图例中为ASCII 28和13,也就是“文件分隔符”和“回车符”。业务操作会自动在发送的TCP数据尾部加入这些开始字符。 5. Remove Framing: 是否把收到的TCP响应数据中标记TCP起止的字符删除。建议选中 6. Discard Incorrect Framing:丢弃使用不正确起始字符的TCP响应数据。建议在调试阶段取消选中,测试完成后再选中 启用该业务操作后,既可以发送TCP请求了。 3.3 测试通用TCP业务操作 因为TCP业务操作的请求消息是Ens.StreamContainer,里面是流数据,为了方便测试,我们建立一个测试用的业务流程,里面组织好数据并调用通用TCP业务操作。 3.3.1 创建一个新的业务流程,设置其请求消息为Ens.StringRequest,用于测试时传入TCP数据。并为其上下文增加一个名为DataBody、类型为%Stream.GlobalCharacter(可持久化的字符流类型)的属性: 3.3.2 在业务流程中增加一个代码流程(<code>),将请求消息的字符串数据写入上下文的DataBody字符流: Do context.DataBody.Write(request.StringValue) 注意行首加空格。 3.3.3 然后在业务流程中再加入一个调用流程(<call>),调用上面已经加入production的业务操作,例如TCPtoWMS,并设置请求和响应消息为Ens.StreamContainer或Ens.StreamContainer。 3.3.4 配置RESTtoLIS业务操作的请求消息(Request) 可以直接点击构建请求消息(Request Builder)按钮,使用图形化拖拽建立请求消息: 将左边上下文context里的DataBody拖拽到callrequest的Stream属性上。 3.3.5 将业务流程编译后加入到Production。 3.3.6 测试这个业务流程,输入测试字符串。然后查看消息追踪,可以看到类似这样的: 这是测试业务流程/业务操作的消息追踪: 因为TCP数据发给了同一个production下的通用业务服务,因此还会看到这样的一笔业务服务的消息追踪:
公告
Claire Zheng · 十二月 5, 2023

【Online Meetup】视频回放:InterSystems开发者社区第二届技术征文大赛线上分享会

2023年11月24日19:00-20:00,InterSystems开发者社区举办了“InterSystems第二届技术征文大赛线上分享会”,邀请参赛作者进行了作品分享&点评,此次分享吸引了66位开发者参会。 未参加此次会议的社区成员,可通过以下链接了解此次Meetup详情(请注意,您需要登录后申请查看视频) 录制: InterSystems开发者社区第二届技术征文大赛线上分享会日期: 2023-11-24 18:49:35录制文件:https://meeting.tencent.com/v2/cloud-record/share?id=56b2bb32-14db-4f40-89bd-de6e42b103c7&from=3 请注意:您需要提出申请,申请通过后,即可查看视频。
文章
Qiao Peng · 十二月 4, 2023

通用RESTful 业务服务和业务操作

1. 通用RESTful业务服务和业务操作 InterSystems IRIS 提供了一组通用的RESTful 业务服务和业务操作类,用户无需开发自定义的业务服务和业务操作类,就可以直接向外提供RESTful服务和调用外部的RESTful API。 BS EnsLib.REST.GenericService 通用REST业务服务 BS EnsLib.REST.SAMLGenericService 检查SAML令牌的签名和时间戳的REST业务服务 BO EnsLib.REST.GenericOperation 通用REST业务操作 BO EnsLib.REST.GenericOperationInProc 用于透传模式的通用REST业务操作 2. 通用RESTful 消息 通用的RESTful 业务服务和业务操作类使用一个通用的RESTful消息类 - EnsLib.REST.GenericMessage,它是EnsLib.HTTP.GenericMessage的子类,二者数据结构都是 HTTPHeaders 记录http头的数组 Stream 记录http体的数据流 Type 数据流类型,例如是字符流还是二进制流。自动赋值,无需设置 Attributes 记录属性的数组 OriginalFilename 无需使用 OutputFolder 无需使用 OutputFilename 无需使用 因此EnsLib.REST.GenericMessage和EnsLib.HTTP.GenericMessage都可以被通用RESTful业务操作和业务服务所使用。 3. 通用RESTful 业务操作 使用通用的RESTful业务操作,可以连接到任何第三方的RESTful服务器,调用其RESTful API。 3.1 向production中加入通用RESTful业务操作 增加通用RESTful业务操作,只需要在Production配置页面的操作中添加EnsLib.REST.GenericOperation。 建议加入Production时,给业务操作起一个名字,用于代表具体的业务,例如是连接到LIS的RESTful 服务,可以命名为RESTtoLIS(可以考虑的命名规则 - 接口方式+业务系统)。如果未命名,默认会使用类名作为业务操作名。 3.2 配置通用RESTful业务操作 主要的设置项是以下3个: 1. HTTP服务器:目标RESTful服务器的服务器名或IP地址 2. HTTP端口:目标RESTful服务器提供RESTful API的端口号 3. URL:RESTful API的服务端点 启用该业务操作后,既可以访问外部RESTful API了。 3.3 测试通用RESTful业务操作 启用后,加入的通用的RESTful业务操作即可测试了。因为EnsLib.HTTP.GenericMessage的REST消息体是一个流类型的属性,为了测试时方便输入这个数据,我们增加一个业务流程。 1. 创建一个新的业务流程,设置其请求消息为Ens.StringRequest,用于测试时传入REST body数据。并为其上下文增加一个名为DataBody、类型为%Stream.GlobalCharacter(可持久化的字符流类型)的属性: 2. 在业务流程中增加一个代码流程(<code>),将请求消息的字符串数据写入上下文的DataBody字符流: Do context.DataBody.Write(request.StringValue) 注意行首加空格。 3. 然后在业务流程中再加入一个调用流程(<call>),调用上面已经加入production的业务操作,例如RESTtoLIS,并设置请求和响应消息为EnsLib.REST.GenericMessage或EnsLib.HTTP.GenericMessage。 4. 配置RESTtoLIS业务操作的请求消息(Request) 可以直接点击构建请求消息(Request Builder)按钮,使用图形化拖拽建立请求消息: 4.1 将左边上下文context里的DataBody拖拽到callrequest的Stream属性上; 4.2 对callrequest的HTTPHeaders赋值,它是一个元素类型为字符串的数组,代表HTTP请求的头。以下3个HTTP头是必须要填写的: HTTP头属性说明 下标 值 HTTP方法 "httprequest" 例如"POST" HTTP消息体的内容类型 "content-type" 例如"application/json" 客户端希望接收的内容类型 "Accept" 例如"*/*" 这3个数组元素赋值,可以通过在添加操作下拉列表中设置(Set)进行赋值。 5. 将业务流程加入Production,并测试 确保Production的设置是允许调试。在Production配置页面中选中这个业务流程,在右侧的操作标签页中选择测试按钮,并在弹出的测试消息页面里填入测试用的数据,并点击调用测试服务: 然后可以检查测试的消息处理流程,并确认REST消息体和HTTP消息头被正确地传递到目标REST API 4. 通用RESTful 业务服务 使用通用的RESTful业务服务,可以向外发布能处理任何RESTful API调用请求的RESTful服务端。 4.1 将通用RESTful业务服务加入Production 在Production配置页面,点击服务后面的加号。弹出的向导页面,服务类选择EnsLib.REST.GenericService;输入服务名,建议写一个能代表组件功能的名字,例如向HIS系统开放的REST服务,可以起名RESTforHIS;选中立即启用。 RESTful通用业务服务可以通过2种方式向外提供RESTful API服务:第一种通过Web服务器向外提供服务,第二种使用IRIS服务器的特定TCP端口向外提供服务。第二种方式不依赖于独立的Web服务器,但推荐使用Web服务器,从而得到更好的性能和安全性。 这里我们使用Web服务器提供REST服务,因此在业务服务的端口配置中,保持空白。在接受消息的目标名称中,选择接收RESTful API请求的业务流程或业务操作,这里我们测试使用一个空的业务流程。点击应用激活这些设置。 4.2 建立一个向外提供RESTful API的Web应用 向外发布RESTful服务,不仅涉及到服务发布的URL,还涉及到安全。我们通过创建一个专用的Web应用来进行管理和控制。 在IRIS系统管理门户>系统管理>安全>应用程序>Web应用程序 中,点击新建Web应用程序按钮,新建一个Web应用程序,并做以下配置: 1. 名称,填写一个计划发布的服务端点,例如/IRISRESTServer。注意前面的/ 2. NameSpace,选择Production所在的命名空间 3. 选中启用 REST,并设置分派类为EnsLib.REST.GenericService 4. 根据安全需要,配置安全设置部分。这里方便测试起见,允许的身份验证方法选择了未验证(无需验证)。如果是生产环境,或者您在做性能压力测试,都应该选择密码或Kerberos安全的身份验证方式! 注意,请保证同一个命名空间下,仅有一个分派类为EnsLib.REST.GenericService的REST类型的Web应用。 4.3 测试RESTful业务服务 现在就可以测试这个RESTful业务服务了。这个RESTful服务可以响应任何REST API的请求,如何响应则是后续业务流程/业务操作的事。 它的完整的RESTful URL是:[Web服务器地址]:[Web服务器端口]/[Web应用的名称]/[通用REST服务在production中的配置名]/[API名称和参数],例如我在IRIS本机的私有Apache的52773端口上访问上面创建的REST通用业务服务,调用PlaceLabOrder的API (注意,这里我们并没有实现过PlaceLabOrder这个API,但我们依然可以响应,而不会报404错误),那么完整的REST 调用地址是: 127.0.0.1:52773/IRISRESTServer/RESTforHIS/PlaceLabOrder 打开POSTMAN,用POST方法,发起上面REST API的调用: 在IRIS里会得到类似这样的消息追踪结果,如果你没有实现过处理REST API请求的业务流程,会得到一个500错,但依然可以查看IRIS产生的EnsLib.HTTP.GenericMessage消息内容: 这个通用RESTful业务服务会把REST请求转换为EnsLib.HTTP.GenericMessage消息,向目标业务操作/业务流程发送。因此,通过解析它的消息内容,就知道REST API请求的全部信息: 1. Stream里是POST的数据 2. HTTPHeaders 的下标"HttpRequest"是HTTP的方法 3. HTTPHeaders 的下标"URL"是完整的API路径,包括了服务端点(在"CSPApplication"下标下)、REST业务服务名称(在"EnsConfigName"下标下)和API 后续业务流程可以通过这些数据对REST API请求进行响应。 4.4 使用业务流程对REST API调用进行路由 有了通用RESTful业务服务生成的EnsLib.HTTP.GenericMessage消息,我们就可以使用消息路由规则或业务流程对REST API请求进行路由。这里我使用业务流程方法对REST API请求进行路由演示。 构建一个新的业务流程,请求消息和响应消息都是EnsLib.REST.GenericMessage或EnsLib.HTTP.GenericMessage,同时为context增加一个名为ReturnMsg的字符串类型的属性,并设置它默认值为:"{""Code"":-100,""Msg"":""未实现的API""}"。 在业务流程里增加一个<switch>流程,然后在<switch>下增加2个条件分支,分别为: 名称:下达检验医嘱,条件:判断是否http头的URL为PlaceLabOrder,且http头的HttpRequest为POST: (request.HTTPHeaders.GetAt("URL")="/IRISRESTServer/RESTforHIS/PlaceLabOrder") && (request.HTTPHeaders.GetAt("HttpRequest")="POST") 名称:查询检验项目,条件:判断是否http头的URL为GetLabItems,且http头的HttpRequest为GET: (request.HTTPHeaders.GetAt("URL")="/IRISRESTServer/RESTforHIS/GetLabItems") && (request.HTTPHeaders.GetAt("HttpRequest")="GET") 在两个分支里,分别增加<code>, 产生返回的REST消息内容: Set context.ReturnMsg="{""Code"":200,""Msg"":""检验医嘱下达成功""}" Set context.ReturnMsg="{""Code"":200,""Msg"":""查询检验项目成功""}" 最后在<switch>后增加一个<code>,构建响应消息: // 初始化响应消息 set response = ##class(EnsLib.REST.GenericMessage).%New() // 初始化响应消息的流数据 Set response.Stream = ##class(%Stream.GlobalCharacter).%New() // 将REST返回数据写入流 Do response.Stream.Write(context.ReturnMsg) 编译这个业务流程,并将其加入Production。 之后修改通用RESTful业务服务的设置,将接收消息的目标名称改为这个新建的业务流程。 现在再通过POSTMAN测试一下各种API,并查看返回REST响应: 在真实项目中,根据实际情况,将上面<switch>流程分支的<code>替换为API响应业务流程或业务操作即可。 总结:使用通用RESTful业务操作和业务服务,无需创建自定义的RESTful 业务组件类,就可以调用外部RESTful API和向外提供RESTful API服务,降低开发和实施成本,实现低代码开发。 后记:关于EnsLib.REST.GenericService对CORS(跨域资源共享)的支持 CORS是一种基于 HTTP 头的机制,通过允许服务器标示除了它自己以外的其它origin(域、协议和端口)等信息,让浏览器可以访问加载这些资源。所以要让EnsLib.REST.GenericService支持CORS,需要让它的响应消息增加对于CORS支持的HTTP头的信息,这里不详细介绍这些头含义了,大家可以去W3C的网站或者搜索引擎查询具体定义,最简单可以使用以下代码替代上面4.4中的初始化响应消息代码: // 设置HTTP响应的头信息 set tHttpRes=##class(%Net.HttpResponse).%New() set tHttpRes.Headers("Access-Control-Allow-Origin")="*" set tHttpRes.Headers("Access-Control-Allow-Headers")="*" set tHttpRes.Headers("Access-Control-Allow-Methods")="*" // 初始化响应消息 set response = ##class(EnsLib.REST.GenericMessage).%New(,,tHttpRes)
文章
Lilian Huang · 十一月 24, 2023

现有系统通过使用InterSystems FHIR 适配器提供 FHIR 服务 - 架构

我们继续使用FHIR适配器的示例,在本文中,我们将回顾如何在我们的IRIS实例中进行配置以及安装的结果。 配置项目的步骤与官方文档中所示的相同,您可以直接在此处查看。好吧,让我们开始工作吧! 安装 正如您在与本文相关的项目中看到的,我们将 IRIS 实例部署在 Docker 中,因此初始配置的主要部分将在 Dockerfile 中完成。别担心,我们不会详细介绍 Docker 配置。 要安装 FHIR 适配器,我们只需: 在我们的 IRIS 实例中使用互操作性功能创建一个名为ADAPTER的命名空间。 从 IRIS 终端访问我们的命名空间并执行以下命令。 set status = ##class (HS.FHIRServer.Installer).InteropAdapterConfig( "/Adapter/r4" ) 在我们的例子中,我们定义了将接收 REST 请求的 IRIS 端点的 URL 为/Adapter/r4 。 安装结果 FHIR 适配器安装完成后,我们可以查看 IRIS 实例中发生的情况。为此,我们首先查看 Web 应用程序菜单(系统管理 -> 安全 -> 应用程序 -> Web 应用程序) 正如我们所看到的,一个新的 Web 应用程序已添加到列表中,表明它对应于我们的 ADAPTER 命名空间。让我们访问它以更详细地查看其配置。 正如我们所看到的,创建的 Web 应用程序启用了 REST 调用的接收,并且负责管理这些调用的类是HS.FHIRServer.HC.FHIRInteropAdapter 。我们看到的另一个细节是密码身份验证和未经身份验证的调用均已启用。对于我们的示例,我们不会修改任何内容,但如果在任何生产环境中启用 JWT 身份验证,那就会很有趣。 让我们回顾一下命名空间的制作过程中发生了什么。 安装过程已经创建并部署了两个新组件,即业务服务 InteropService 和业务操作 InteropOperation。在我们的示例中,我们将仅使用 InteropService,它将负责转发接收到的FHIR消息,该消息将是类 HS.FHIRServer.Interop.Request 的实例,我们将在其上进行操作以提取接收到的信息。InteropService必须接收的响应以返回响应JSON将是 HS.FHIRServer.Interop.Response 类型的实例。 我们的“HIS”的配置 我们在上一篇文章中提到,我们将模拟与一个理论上的HIS的互操作性,为此,我们在 Docker 中部署了一个 PostgreSQL 实例以及一系列测试表。为了启动对此外部数据库的查询,我们包含并配置了 Java 网关,以便我们可以通过 JDBC 建立必要的连接。我们还包含了用于连接 PostgreSQL 的 JAVA 库。 让我们看看负责此连接的生产组件。 我们将 JavaGateway 配置为指向我们在 Docker 中部署的 Java 虚拟机: 业务操作FromAdapterToHIS将负责对我们的PostgreSQL进行查询,让我们看看它的配置: 正如我们所看到的,它使用EnsLib.SQL.OutboundAdapter作为 Adapter 类,这将允许我们直接连接到“HIS”的数据库。 DSN 值将是我们的 Docker 中部署的 PostgreSQL 实例的连接字符串。 总之... 让我们回顾一下我们在本文中所做的事情: 在我们的命名空间中安装FHIRAdapter并检查我们是否有一个端点可以将 FHIR 消息发送到。 检查我们的命名空间(InteropService 和 InteropOperation)生产中的缺陷所创建的组件。 创建与我们的“HIS”数据库通信所需的组件。 通过这些步骤,我们已准备好开始接收 JSON 格式的 FHIR 消息。在下一篇文章中,我们将创建负责处理接收到的消息的业务流程,并实现我们需要查阅和编写有关 PostgreSQL 数据库的不同功能。 非常感谢您的关注!
文章
Lilian Huang · 十一月 24, 2023

现有系统通过使用InterSystems FHIR 适配器提供 FHIR 服务 - 简介

想必大家都听说过 FHIR 是解决系统间所有互操作性和兼容性问题的灵丹妙药和解决方案。就在这里,我们可以看到他手持一份 FHIR 资源,愉快地享受其中: 但对于我们这些普通人,我们将做一个小小的介绍。 什么是 FHIR? 让我们直接进入定义:FHIR(Fast Healthcare Interoperability Resource)是由HL7(Health Level 7标准组)开发的一种互操作性标准,旨在实现医疗行业中不同系统之间的电子医疗数据交换。 FHIR 从根本上基于哪些技术? 主要是通过 REST API 和 JSON 格式进行 HTTP 调用的结合(尽管它可以是 XML 以及我们可用的任何其他通信,具体根据我们的使用情况)。 我们如何与 FHIR 合作? 一般来说,最简单的方式是拥有一个FHIR服务器,我们将使用诸如GET(从服务器获取数据)、PUT(更新数据)、POST(保存数据)和DELETE(删除数据)等HTTP调用与其通信。 FHIR处理了“资源”(Resource)的概念,用于在服务器和客户端之间发送和接收数据。这些资源旨在涵盖系统间80%的互通性需求。在这里,我们可以看到默认情况下可用的资源图示。 如您所见,每个资源都附带一个表示资源成熟度的数字或字母(其中N = 正式)。如果您访问官方的FHIR文档,您将能够获取到众多示例。 资源的一种扩展是“Bundle”,简言之,它是一组封装在同一JSON中的资源,用于对我们的服务器进行查询以及执行批量或事务中的CRUD操作。 完美,FHIR听起来很棒,但是...我们如何将其应用到我们的传统系统中,这些系统并不是按照FHIR定义的标准设计的呢? FHIR适配器 InterSystems 向其客户提供 FHIR 适配器功能,这将使他们能够在其传统现有系统之上设置业务层,开发所谓的 FHIR Façade。在接下来的文章中,我们将了解如何使用 FHIR 对象并与使用 PostgreSQL 数据库的 HIS(健康信息服务)系统的小型模拟进行交互。 为了理解这些解释,您可以使用一个 OpenExchange 应用程序,它将自动设置我们将在未来几天遵循的示例: 研讨进程 在接下来的文章中,我们将讨论以下几点: IRIS 实例中的 FHIR 适配器架构 在我们的 HIS 中注册患者类型资源。 使用 REST API 调用按 其ID 查询患者。 在我们的 HIS 中注册包含患者和医疗中心数据的捆绑包。 因此,如果您有兴趣...请在未来几天继续关注社区!
公告
Claire Zheng · 十一月 23, 2023

腾讯会议邀请:欢迎参加今晚19:00获奖作品线上分享会

🏆InterSystems开发者社区中文版第二届技术征文大赛🏆(←点击链接进入参赛页面,浏览所有参赛文章)获奖名单已公布! 11月24日19:00-20:00,InterSystems开发者社区将举办“InterSystems第二届技术征文大赛线上分享会”,邀请参赛作者进行作品分享&点评、探讨热门话题,同期还将送出多份幸运奖品,欢迎参会! 特别提醒:今晚拼手速,赢取幸运奖品,请提前准备好自己的社区主页链接,以便快速填写(点击头像右上角进入个人主页,复制浏览器链接即可,如:https://cn.community.intersystems.com/user/claire-zheng) 会议主题:InterSystems开发者社区第二届技术征文大赛线上分享会会议时间:2023/11/24 19:00-20:00 (GMT+08:00) 中国标准时间 - 北京 点击链接入会,或添加至会议列表:https://meeting.tencent.com/dm/a7BNMvn2Sqx4 #腾讯会议:306-552-860 复制该信息,打开手机腾讯会议即可参与
公告
Claire Zheng · 十一月 23, 2023

InterSystems开发者社区中文版第二届技术征文大赛获奖名单公布!

大家好! 终于到了宣布获奖名单的时间! 🏆InterSystems开发者社区中文版第二届技术征文大赛🏆(←点击链接进入参赛页面,浏览所有参赛文章)已经结束,此次大赛收到了来自8名参赛者的12篇参赛文章,最终进入评选的文章为10篇,感谢大家的积极参与! 以下是获奖名单! 专家提名奖:活动期间发布文章且成功参赛后,由InterSystems专家评选得出 🥇第一名,姚 鑫,作品:浅谈一下个人基于IRIS后端业务开发框架的理解 🥈第二名,王喆 👀, 作品:IRIS自动安装集群--manifest(安装清单) 🥉第三名,Yuxiang Niu,作品:关于Cache中查看关键锁的几种方式 🏆第四名,liu bo,作品:通过自定义数据类型实现参数统一验证优化重构代码 开发者社区奖:活动期间发布文章且成功参赛后,由社区成员点赞评选得出 🥇第一名,Yongfeng Hou ,作品:IRISHealth在DBServer和ECPApp之间启用SSL/TLS安全双向认证加密通信 🥈第二名,Meng Cao ,作品:使用支持SSL的ODBC连接IRIS数据库 🥉第三名,water huang,作品:进程表 🏆第四名,haoyinhang Hao ,作品:通过XSL自动生成消息模型 恭喜获奖者! 感谢大家的积极参与! 奖品领取 请获奖者点击【获奖者信息提交】提交信息,以便我们及时与您联系奖品寄送事宜。 提醒:填写前请准备好自己的社区主页链接(点击头像右上角进入个人主页,复制浏览器链接即可,如:https://cn.community.intersystems.com/user/claire-zheng)
公告
Claire Zheng · 十一月 23, 2023

投票即将截止!获奖名单将于明天公布(附腾讯会议邀请)

大家好! 🏆InterSystems开发者社区中文版第二届技术征文大赛🏆(←点击链接进入参赛页面,浏览所有参赛文章)即将步入尾声!“征文&投票”环节即将结束(截至11月23日23:59)!来抓住最后的时间为你喜欢的作品投票吧! 11月24日19:00-20:00,InterSystems开发者社区将举办“InterSystems第二届技术征文大赛线上分享会”,邀请参赛作者进行作品分享&点评、探讨热门话题,同期还将送出各类奖品,欢迎参会! 会议主题:InterSystems开发者社区第二届技术征文大赛线上分享会会议时间:2023/11/24 19:00-20:00 (GMT+08:00) 中国标准时间 - 北京 点击链接入会,或添加至会议列表:https://meeting.tencent.com/dm/a7BNMvn2Sqx4 #腾讯会议:306-552-860 复制该信息,打开手机腾讯会议即可参与
文章
Hao Ma · 十一月 22, 2023

访问 IRIS 终端:Visual Studio Code 用户综合指南

介绍 由于InterSystems最近宣布从2023.2版本开始停止对InterSystems Studio的支持,转而独家开发Visual Studio Code(VSC)IDE的扩展,相信后者比Studio提供了更优越的体验,我们很多开发者都已切换或开始使用 VSC。很多人可能想知道如何打开终端进行操作,因为VSC没有像Studio那样的输出面板,也没有集成的功能来打开IRIS终端,除非下载InterSystems开发的插件。 概括 介绍 解决方案 对于至少具有 IRIS 2020.1 或 IRIS IRIS 2021.1.2 的用户– 使用 Web 终端 对于至少具有 IRIS 2023.2 的用户 – 使用 WebSocket 终端 对于使用基于 Docker 的 IRIS 的用户 对于在本地计算机上使用 2023.2 之前的 IRIS 版本的用户 对于使用 SSH 连接在基于远程服务器的 IRIS 上进行编码的用户 解决方案 在 VSC 中打开终端的方法有多种,具体取决于您使用的具体配置,我在这里总结了适合任何情况的最佳解决方案: 对于至少具有 IRIS 2020.1.1 或 IRIS 2021.1.2 的用户 – 使用 Web 终端 至少拥有 IRIS 2020.1.1 或 IRIS 2021.1.2 且被允许安装外部扩展的用户(某些人可能由于公司有关第三方应用程序的政策而不允许安装),可能会发现 VSC 的 Web 终端扩展很有用。谁不知道, Web 终端是一个基于 Web 的 InterSystems 产品终端,使用 ObjectScript(例如 IRIS、Caché、Ensemble、HealthShare、TrakCare)构建,允许在浏览器中使用更高级版本的终端( 这里是项目页面)。通过此 VSC 扩展,只需单击一下即可直接从 VSC 启动基于 Web 的终端。 要打开 Web 终端,请单击: InterSystems Tools > 选择一个名称空间 > 单击以下图标之一 ( , )在 VSC 终端面板或浏览器上打开 Web 终端(按 Alt 更改默认图标): 对于至少具有 IRIS 2023.2 的用户 – 使用 WebSocket 终端 至少拥有 IRIS 2023.2 的用户可以利用最新版本的 VSC 扩展中包含的新“ WebSocket 终端”功能,并且不需要其他解决方法。 要打开 WebSocket 终端,请单击: InterSystems Tools > 选择一个名称空间 > 单击 Web 终端旁边的图标。 对于使用基于 Docker 的 IRIS 的用户 在 Docker 中使用 IRIS 环境并使用 VSC 的人员可以直接在 Docker 环境中启动终端会话。 单击状态栏中的 Docker 语音,然后选择Open Terminal in Docker 。 我要感谢@Evgeny.Shvarov 有关这一点的图片和解释。 对于在本地计算机上使用 2023.2 之前的 IRIS 版本的用户 对于使用在本地计算机上运行的 IRIS 版本的用户,可以在 VSC 中设置专用的 IRIS 终端: 打开设置.json 文件。您可以通过多种方式找到它,例如单击“视图”> “命令面板”> 输入:“设置”>打开用户设置 (JSON) 在“ terminal.integrated.profiles.windows ”下添加以下代码: "terminal.integrated.profiles.windows" :{ "IRIS Terminal" : { "path" : [ "C:\\InterSystems\\IRISHealth\\bin\\irissession.exe" ], "args" : [ "IRISHEALTH" ], "icon" : "terminal-cmd" } } 注意:插入irissession.exe的正确路径。 C。要从 VSC 打开终端,请导航至:终端>新终端>启动配置文件... > IRIS 终端。 d.终端菜单中现在应该可以使用“IRIS Terminal”语音: 对于使用 SSH 连接在基于远程服务器的 IRIS 上进行编码的用户 对于使用基于可通过 SSH 连接(例如使用PuTTY )访问的远程服务器(例如公司服务器)的 IRIS 版本的人员来说,可以使用远程 - SSH VSC扩展将 VSC 直接连接到服务器。为此: 安装远程 - SSH:编辑配置文件 VSC 扩展; 单击“远程资源管理器”图标 在侧边栏中; 选择“打开 SSH 配置文件” 并打开配置文件,路径为: C:\Users\<用户名>\.ssh\config 在配置文件中插入以下代码: Host my-putty-connection HostName < IP address or server name > User < username > IdentityFile < private key path on your local machine > Port < port > IP 地址和端口对应于 PuTTY 中指定的主机名和端口,用户名是用于访问远程服务器的用户凭据,IdentityFile 是 PuTTY 私钥的文件路径。 注意:VSC 无法读取 PuTTY (.ppk) 生成的私钥的原始格式。要通过 PuTTY 在 VSC 和远程服务器之间建立连接,您必须复制原始私钥并将新版本转换为 .pem 格式。为了进行转换: 启动 PuTTYgen 应用程序 在“文件”菜单下,单击“加载私钥” 选择 .ppk 格式的私钥,然后选择“打开” 在“转换”菜单下,单击“导出 OpenSSH 密钥”(强制使用新文件格式)。 设置扩展名为 .pem 的新名称,然后单击“保存”按钮。 将此新 .pem 文件的路径链接到 VSC 中的IdentifyFile 参数 保存文件。几秒钟后,新连接应出现在“远程资源管理器”面板中; 单击“在新窗口中连接... ”以在新的 VSC 窗口中打开 SSH 连接: 选择远程计算机的操作系统(仅在第一次访问时) 在新窗口中,导航至:终端>新终端(或使用快捷键 Ctrl + ò 或 Ctrl + Shift + ò)。 您现在已连接到远程计算机,并且可以在 VSC 中使用其 IRIS 终端。 注意:此操作仅在您之前通过 PuTTY 启动远程连接时有效,并且在 PuTTY 关闭或未连接到远程服务器时不起作用。此操作不会启动 PuTTY,它仅允许 VSC 连接到 PuTTY 建立的隧道。 要通过 VSC 启动 PuTTY 连接,您可以使用批处理文件(在 Windows 上)。提供的connect_remote.bat文件使用 PuTTY 附带的 Plink 命令来启动会话: @echo off set SESSION="<your saved session name>" plink -load %SESSION% 要启动会话,只需在 VSC 终端中键入.\connect_remote.bat以打开远程连接并插入您的凭据。 注意:后一种方法使您可以访问支持所有 VSC 快捷方式的终端版本!欢迎回来 Ctrl+V,再见 Shift+Insert 🎉
公告
Claire Zheng · 十一月 15, 2023

InterSystems Java 编程大赛

Hi 开发者们, 我们非常高兴地邀请大家参加新的 InterSystems 在线编程竞赛,重点关注 Java 及其衍生产品! 🏆 InterSystems Java 编程大赛🏆 时间: 2023年11月13日至12月3日(美国东部时间) 奖金池: 14,000 美元 话题 我们邀请您在新的编程竞赛中使用 Java!使用 Kotlin、Clojure 和 Scala 的应用程序也很受欢迎。 提交使用 Java、Kotlin、Clojure 或 Scala 以及 InterSystems IRIS 或 InterSystems IRIS for Health 的开源应用程序。 一般要求: 应用程序或库必须功能齐全。它不应该是另一种语言中已有库的导入或直接接口(C++ 除外,您确实需要做大量工作来为 IRIS 创建接口)。它不应该是现有应用程序或库的复制粘贴。 有效的应用程序:100%全新的Open Exchange Apps或已有的应用程序(但有显著提升)。所有参赛者/团队提交的应用程序只有经过我们团队的审核之后才会被批准参赛。 该应用程序应在 IRIS Community Edition 或 IRIS for Health Community Edition 上运行。两者都可作为host (Mac, Windows)版从Evaluation Site下载,或者可以按从InterSystems Container Registry或Community Container中提取的容器形式使用: intersystemsdc/iris-community:latest 或 intersystemsdc/irishealth-community:latest 。 该应用程序应该是开源的并发布在 GitHub 上。 应用程序的README应为英文,包含安装步骤,并包含视频demo或/和应用程序工作原理的描述。 一名开发者只允许提交 3 份作品。 注意:我们的专家将根据申请的复杂性和实用性标准对是否批准参加比赛拥有最终决定权。他们的决定是最终决定,不得上诉。 奖品 1. 专家提名奖(Experts Nomination)——获奖者由我们特别挑选的专家团选出: 🥇第一名 - 5,000 美元 🥈第二名 - 3,000 美元 🥉第三名 - 1,500 美元 🏅第四名 - 750 美元 🏅第五名 - 500 美元 🌟第 6-10 名 - 100 美元 2. 社区提名奖(Community Nomination)- 获得总票数最多的应用程序: 🥇第一名 - 1,000 美元 🥈第二名 - 750 美元 🥉第三名 - 500 美元 🏅第四名 - 300 美元 🏅第五名 - 200 美元 如果几位参与者获得相同数量的选票,他们都将被视为获胜者,奖金由获胜者分享 谁可以参加? 任何开发者社区的成员均可参加,InterSystems内部员工除外(InterSystems contractor员工可以参加)。还没有账号?现在来建一个! 👥开发人员可以组队创建协作应用程序。一个团队允许 2 到 5 名开发人员。 请注意,要在您的README文件中标注您的团队成员——社区用户profile。 重要截止日期: 🛠 应用程序开发和注册阶段: 2023 年 11 月 13 日(美国东部时间 00:00):比赛开始。 2023 年 11 月26 日(美国东部时间 23:59):提交截止日期。 ✅ 投票时间: 2023 年 11 月 27 日(美国东部时间 00:00):投票开始。 2023 年 12 月3 日(美国东部时间 23:59):投票结束。 注意:在整个参赛期间(开发与投票期间),开发者可持续编辑、提升其应用。 资源助力 1. 使用 InterSystems IRIS 开发 Java 应用程序: InterSystems Java Connectivity Options Learning Path Connecting Java Applications to InterSystems Products JDBC Driver Documentation XEP Java Documentation Native API for Java Documentation iris JDBC driver distribution 2. ObjectScript Package Manager (IPM)初学者: How to Build, Test and Publish ZPM Package with REST Application for InterSystems IRIS Package First Development Approach with InterSystems IRIS and ZPM 3. 如何将您的APP提交给大赛: 如何在 Open Exchange 上发布应用程序 如何提交比赛申请 4. 应用示例: native-api template workshop-pex fhir-client-java pex-demo iris-hibernate iris-liquibase 5. 视频: Using Java to Connect to InterSystems Connecting to InterSystems Cloud Services with Java What is PEX? InterSystems Connectivity with Java and other languages Deploying Java project + InterSystems IRIS in Docker 需要帮忙? 加入 InterSystems Discord 服务器上的竞赛频道或在本文评论中与我们交谈。 期待您的精彩提交 - 加入我们的编程大赛吧!来赢得胜利! ❗️参加本次比赛即表示您同意此处列出的比赛条款。请在继续之前仔细阅读它们。 ❗️
公告
Claire Zheng · 十一月 9, 2023

来投票选出适合发布公告的创意吧!

Hi 社区成员们! 我们非常兴奋地推出一系列全新的公告,展示您在创意门户中所提交的创意的实施情况。通过这个系列,我们将聚焦那些已转化为现实世界解决方案的令人赞叹的想法。 我们的社区一直是创造力、创新和协作的重要中心,这正说明了我们拥有一批非凡的人才。通过这些公告,我们为那些从奇思妙想到代码诞生而庆祝欢呼。本系列中的每个公告都将展示 InterSystems 产品概念的建议想法,并让您亲身体验代码的神奇魅力。 第一批得到实施的创意是: 创意 创意实施者 Global->JSON->Global converter @Robert Cemper Introduce the project of helpful one-liners @Evgeny Shvarov Examples to work with IRIS from Django @Dmitry Maslennikov @Heloisa Paiva 3DES support @yurimarx Marx Include support for gRPC protocol in IRIS @Guillaume Rongier Create a UI for convenient and easy transfer of projects to other system instances for fast deployment. @Sergey Mikhailenko 在下面的投票中投票选出您希望首先展示的想法。 一如既往地欢迎您在评论中提出有关公告内容的建议!
公告
Claire Zheng · 十一月 9, 2023

InterSystems开发者社区中文版第二届技术征文大赛专家评审团亮相!

大家好! 2023年9月19日-11月24日(北京时间),🏆InterSystems开发者社区中文版第二届技术征文大赛🏆正在进行中(←点击链接进入参赛页面,浏览所有参赛文章)!作为此次大赛重要奖项“专家提名奖”评比的重要部分,我们的专家评审团已组建成团! 以下为我们的专家团成员,来自我们的销售工程师团队与WRC支持团队。 @Yunfei.Lei @Peng.Qiao @Lin.Zhu @jieliang.liu7848 @Ida.Yang @Louis.Lu @Hao.Ma @Jingwei.Wang @Tete.Zhang @Tengzhou.Zhuang 我们期待专家评审团对参赛作品的公平审阅与打分。 作为社区成员,您的个人贡献也会对每一篇参赛文章产生影响,每一次浏览和点赞都将助力您喜欢的文章赢得“开发者社区奖”。 欢迎大家积极投稿、点赞、分享、学习! 欢迎积极参加InterSystems开发者社区中文版第二届技术征文大赛
公告
Michael Lei · 十月 24, 2023

官宣对 CentOS 的支持终止

终止对 CentOS 的支持 自 InterSystems IRIS 2023.3 发布起,CentOS 将不再是受支持的开发平台。 CentOS 一直是一个受支持的开发平台,为开发人员提供了相当于 Red Hat Enterprise Linux (RHEL) 的免费版本,用于 IRIS 开发。您可能知道,Red Hat 对 CentOS 进行了重大更改,CentOS 已成为 RHEL 的“上游”。这意味着它具有 RHEL 中尚未包含的错误和功能,这可能会给在该平台上构建的开发人员带来问题。 我们鼓励使用 CentOS 的开发人员利用 Red Hat 的免费开发人员计划来获得 RHEL 的免费开发许可证。 CentOS 继续支持 IRIS 2023.2(及更早版本)。
公告
jieliang liu · 十月 18, 2023

[视频] FHIR 上的临床警报和通知:将医疗保健行动引擎纳入工作流程

你好社区, 观看此视频,了解如何将 FHIR、CDS Hooks 和低代码医疗保健规则编辑器组合成一个易于使用、功能强大的平台,以帮助确保以最佳方式传递信息: ⏯ FHIR 临床警报和通知:将医疗保健行动引擎纳入 2023 年全球峰会工作流程 🗣演讲者:@Frank.Pandolfe,InterSystems 临床产品经理 订阅我们的Bilibili 频道InterSystems Developers以获取最新更新!