Find

Article
· Nov 12 6m read

Rédaction d'une spécification OpenAPI 2.0

L'INTERFACE DE PROGRAMMATION D'APPLICATION À TRANSFERT D'ÉTAT REPRÉSENTATIF ou API REST (Representational State Transfer Application Programming Interface) est un moyen conforme à la norme permettant aux applications web de communiquer entre elles à l'aide de méthodes HTTP telles que GET, POST, PUT, DELETE, etc. Elle est conçue autour de ressources, qui peuvent être diverses, allant d'un utilisateur à un fichier.

Discussion (0)2
Log in or sign up to continue
Question
· Nov 11

HTTP post request rejected

Hi guys,

I'm looking to mimic this Post request URL where I'm sending a token :

So I created the below code but I'm getting "HTTP/1.1 405 Method Not Allowed" error 

Url="myurl/confirmed?id="_token
Set Httprequest1=##class(%Net.HttpRequest).%New()
Set Httprequest1.SSLConfiguration="LS2"
Set Httprequest1.Server="myserver.com" 
Set Httprequest1.Timeout=30
Set Httprequest1.Https=1
Set Httprequest1.Port=7711
set Httprequest1.ContentType="application/json"
Do Httprequest1.SetHeader("Accept","application/json")
Do Httprequest1.SetHeader("Accept-Language","en_US")
//D Httprequest1.EntityBody.Write(token)
Set tSc=Httprequest1.Post(Url)
Set StateLine=Httprequest1.HttpResponse.StatusLine
^Out2($zdt($h),1)=tSc_"|"_StateLine

So what am I doing wrong ?

Thanks

3 Comments
Discussion (3)3
Log in or sign up to continue
Article
· Nov 11 5m read

终于等到你:欢迎了解InterSystems IRIS对Golang的支持

导言

InterSystems IRIS 数据平台一直以其性能、互操作性和跨编程语言的灵活性而著称。多年来,开发人员可以将 IRIS 与 Python、Java、JavaScript 和 .NET 结合使用,但 Go(或Golang)开发人员却只能望洋兴叹。

Golang Logo

这种等待终于结束了。

新的go-irisnative驱动程序为 InterSystems IRIS 带来了GoLang 支持,实现了标准的 database/sql API。这意味着 Go 开发人员现在可以使用熟悉的数据库工具、连接池和查询接口来构建由 IRIS 支持的应用程序。


为什么要支持 GoLang

GoLang 是一种专为简单性、并发性和性能而设计的语言,是云原生和基于微服务架构的理想选择。它为 Kubernetes、Docker 和 Terraform 等一些世界上最具可扩展性的系统提供了支持。

将 IRIS 引入 Go 生态系统可实现以下目标

  • 使用 IRIS 作为后台的轻量级高性能服务
  • 并行查询执行或后台处理的本机并发性
  • 与容器化和分布式系统无缝集成
  • 通过 Go 的 database/sql 界面进行自动化数据库访问

这种集成使 IRIS 成为现代云就绪 Go 应用程序的完美选择。


开始使用

1.安装

go get github.com/caretdev/go-irisnative

2.连接 IRIS

下面介绍如何使用标准的 database/sql API 进行连接:

import (
    "database/sql"
    "fmt"
    "log"
    _ "github.com/caretdev/go-irisnative"
)

func main() {
    db, err := sql.Open("iris", "iris://_SYSTEM:SYS@localhost:1972/USER")
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    // Simple ping to test connection
    if err := db.Ping(); err != nil {
        log.Fatal("Failed to connect:", err)
    }

    fmt.Println("Connected to InterSystems IRIS!")
}

3.创建表格

让我们创建一个简单的演示表:

_, err = db.Exec(`CREATE TABLE IF NOT EXISTS demo (
    id INT PRIMARY KEY,
    name VARCHAR(50)
)`)
if err != nil {
    log.Fatal(err)
}
fmt.Println("Table created.")

4.插入数据

目前不支持多行插入- 每次调用只插入一行:

_, err = db.Exec(`INSERT INTO demo (id, name) VALUES (?, ?)`, 1, "Alice")
if err != nil {
    log.Fatal(err)
}

_, err = db.Exec(`INSERT INTO demo (id, name) VALUES (?, ?)`, 2, "Bob")
if err != nil {
    log.Fatal(err)
}

fmt.Println("Data inserted.")

5.查询数据

使用 database/sql 界面可直接进行查询:

rows, err := db.Query(`SELECT id, name FROM demo`)
if err != nil {
    log.Fatal(err)
}
defer rows.Close()

for rows.Next() {
    var id int
    var name string
    if err := rows.Scan(&id, &name); err != nil {
        log.Fatal(err)
    }
    fmt.Printf("ID: %d, Name: %s\n", id, name)
}

这就是在 Go 中执行基本 SQL 操作所需的全部内容。


如何运行

在引擎盖下,go-irisnative驱动程序使用IRIS Native API与数据库进行高效的底层通信。该驱动程序实现了 Go 的标准 database/sql/driver 接口,因此可与现有的 Go 工具兼容,例如:IRIS Native API、IRIS Native API、IRIS Native API、IRIS Native API、IRIS Native API:

  • sqlx
  • gorm (使用自定义方言)
  • 标准 Go 移植工具

这为开发人员提供了一个熟悉的 API,具有本地 IRIS 访问的功能和性能。


使用实例

  • 微服务:轻量级Go服务直接连接到IRIS。
  • 数据API:通过REST或gRPC端点暴露IRIS数据。
  • 集成工具:在Go管道中桥接IRIS数据与其他系统。
  • 云原生IRIS应用:在Kubernetes或Docker上部署基于IRIS的Go应用。

使用测试容器进行测试

如果您想运行自动化测试而无需管理实时IRIS实例,可以使用testcontainers-iris-go
它会启动一个临时 IRIS 容器进行集成测试。

测试设置示例:

import (
    "context"
    "database/sql"
    "flag"
    "log"
    "os"
    "testing"
    iriscontainer "github.com/caretdev/testcontainers-iris-go"
    "github.com/stretchr/testify/require"
    "github.com/testcontainers/testcontainers-go"
)

var connectionString string = "iris://_SYSTEM:SYS@localhost:1972/USER"
var container *iriscontainer.IRISContainer = nil
func TestMain(m *testing.M) {
    var (
        useContainer   bool
        containerImage string
    )
    flag.BoolVar(&useContainer, "container", true, "Use container image.")
    flag.StringVar(&containerImage, "container-image", "", "Container image.")
    flag.Parse()
    var err error
    ctx := context.Background()
    if useContainer || containerImage != "" {
        options := []testcontainers.ContainerCustomizer{
            iriscontainer.WithNamespace("TEST"),
            iriscontainer.WithUsername("testuser"),
            iriscontainer.WithPassword("testpassword"),
        }
        if containerImage != "" {
            container, err = iriscontainer.Run(ctx, containerImage, options...)
        } else {
            // or use default docker image
            container, err = iriscontainer.RunContainer(ctx, options...)
        }
        if err != nil {
            log.Println("Failed to start container:", err)
            os.Exit(1)
        }
        defer container.Terminate(ctx)
        connectionString = container.MustConnectionString(ctx)
        log.Println("Container started successfully", connectionString)
    }

    var exitCode int = 0
    exitCode = m.Run()

    if container != nil {
        container.Terminate(ctx)
    }
    os.Exit(exitCode)
}

func openDbWrapper[T require.TestingT](t T, dsn string) *sql.DB {
    db, err := sql.Open(`intersystems`, dsn)
    require.NoError(t, err)
    require.NoError(t, db.Ping())
    return db
}

func closeDbWrapper[T require.TestingT](t T, db *sql.DB) {
    if db == nil {
        return
    }
    require.NoError(t, db.Close())
}

func TestConnect(t *testing.T) {
    db := openDbWrapper(t, connectionString)
    defer closeDbWrapper(t, db)

    var (
        namespace string
        username  string
    )
    res := db.QueryRow(`SELECT $namespace, $username`)
    require.NoError(t, res.Scan(&namespace, &username))
    require.Equal(t, "TEST", namespace)
    require.Equal(t, "testuser", username)
}

这是CI/CD 管道单元测试的理想选择,可确保 Go 应用程序与 IRIS 在隔离状态下无缝运行。


结论

InterSystems IRIS对Go语言的支持现已到来,这无疑是一个变革性的进步。
通过go-irisnative您现在可以直接利用 IRIS 的强大功能构建可扩展、并发和云原生的应用程序。

无论您是要构建微服务、API 还是集成工具,Go 都能为您提供简单性和性能,而 IRIS 则能为您提供可靠性和丰富的数据功能。

👉 来试一试吧!

Discussion (0)1
Log in or sign up to continue
Article
· Nov 11 3m read

GORM 与 InterSystems IRIS 的相遇:介绍一下 gorm-iris

如果你觉得 IRIS 对 Go 的原生支持令人兴奋,那就等着看 GORM 加入后会发生什么吧。


就在最近,随着go-irisnative 的发布,我们迎来了 InterSystems IRIS 的本地 GoLang 支持这仅仅是个开始。现在,我们又推出了gorm-iris ——一个 GORM 驱动程序,旨在为您的 IRIS + Go 堆栈带来对象关系映射 (ORM) 的强大功能。

为什么选择 GORM?

GORM 是 Go 生态系统中最流行的 ORM 库之一。它使使用 Go 结构而不是编写原始 SQL 与数据库交互变得简单。通过自动迁移、关联和查询构建等功能,GORM 极大地简化了后端开发。

因此,在实现 Go 与 IRIS 的本地对话后,下一步自然是让 GORM 与 IRIS 无缝协作。这正是 gorm-iris 所要做的。


什么是 gorm-iris

gorm-iris 是在 go-irisnative 基础上为 InterSystems IRIS 定制的 GORM 驱动程序。它就像一座桥梁,支持开发人员使用熟悉的 GORM 语法和模式与 IRIS 数据库交互,而幕后的所有繁重工作都通过本地 IRIS 调用来处理。

可以将其视为两个世界中的最佳选择:

  • 通过 go-irisnative 实现本地性能和数据访问
  • 通过 GORM 实现开发人员友好的 ORM 功能

主要功能

以下是 gorm-iris 提供的功能:

✅ GORM 和 IRIS 之间的无缝集成
✅ 使用本地 Go 结构为 IRIS 数据建模
✅ 开箱即用的基本 CRUD 操作
✅ 通过 Go 界面自定义行为

当然,这一切都是开源的。


快速入门示例

想开始使用吗?这里有一个最基本的设置来演示如何工作:

package main

import (
	"fmt"
	iris "github.com/caretdev/gorm-iris"
	"gorm.io/gorm"
)

type User struct {
  ID    int
  Name  string
  Email string
}

func main() {
  dsn := "iris://_SYSTEM:SYS@localhost:1972/USER"
  db, err := gorm.Open(iris.Open(dsn), &gorm.Config{})
  if err != nil {
    panic("failed to connect to IRIS")
  }

	// Auto-migrate schema
  db.AutoMigrate(&User{})

  // Create
  db.Create(&[]User{
		{Name: "Johh", Email: "john@example.com"},
		{Name: "Johh1", Email: "john1@example.com"},
		{Name: "John2", Email: "john2@example.com"},
	})

  // Read
  var user User
  db.First(&user, "email = ?", "john1@example.com")
	fmt.Printf("Found: ID: %d; Name: %s\n", user.ID, user.Name)
}

没错,就是这样。


引擎盖下有什么?

gorm-iris 驱动程序通过 go-irisnative 将 GORM 操作转换为本地调用。这意味着你仍然可以获得直接访问 IRIS 的速度和效率,但对于日常用例来说,这只是一个更高层次的抽象。

它非常适合以下开发人员:

  • 希望使用 IRIS 作为后台构建 Go 应用程序
  • 偏好 ORM 式开发而非直接查询构建
  • 希望使用简洁、可读的 Go 代码构建原型或全面的应用程序

发展方向

这只是 0.1.1 版——我们正在积极改进功能覆盖范围、性能调优和处理更复杂的 GORM 功能。

如果您正在使用 GORM,并有反馈意见或功能需求,欢迎提出问题和建议!

👉 查看软件源: https://github.com/caretdev/gorm-iris


最终想法

通过 go-irisnative,我们为 GoLang 开发人员打开了与 InterSystems IRIS 对话的大门。通过 gorm-iris,我们邀请他们留下来共进晚餐。

这个库就是要让 IRIS 在您的 Go 开发工作流中有家的感觉。它简洁、富有表现力,并充分利用了 Go 开发人员已经喜爱的工具。

所以,来吧!试试它,构建一些很酷的东西,并让我们知道你的想法。

Discussion (0)1
Log in or sign up to continue
Article
· Nov 11 7m read

OMOP探索之旅——基于GCP医疗API的实时FHIR®到OMOP数据转换(RealTymus)

实时 FHIR® 到 OMOP 转换

OMOP 之旅的这一部分,我们在尝试挑战Scylla 之前先反思一下,InterSystems OMOP 转换是建立在批量 FHIR 导出作为源有效载荷的基础上的,我们是多么幸运。 这开启了 InterSystems OMOP 转换与多个 FHIR® 供应商的放手互操作性,这次是与谷歌云医疗 API 的 互操作性

谷歌云医疗 API FHIR® (Google Cloud Healthcare API FHIR®)导出

GCP FHIR® 数据库支持通过命令行界面(CLI)或应用程序编程接口(API)进行FHIR数据的批量导入/导出,其前提条件很简单,且相关文档极为详尽,因此我们就不让模型再针对这方面进行赘述训练了,如有兴趣,我们会附上相关链接。 本段标题中更有价值的是bulk FHIR export (批量FHIR导出)标准本身的实现。

谷歌实施 FHIR® 导出的重要区别在于:通过 Pub/Sub 发送资源变更通知,以及指定增量导出的能力。

实时?

是的!我想我会死在这把剑上的。 这不仅是我的说唱手柄,而且其机制绝对可以支持一个很好的技术论证,可以说...

"当一个新的组织被创建到 FHIR 时,我们会对其进行转换,并将其添加到 InterSystems OMOP CDM 中,与 Care_site/location 一样"。

演练

本文试图简明扼要地概括发布/子通知如何与云功能相结合,将这两种解决方案粘合在一起,并在细粒度级别上实现 OMOP 的自动摄取。

第一步:将 InterSystems OMOP 与 AWS Bucket 连接起来

这个步骤在本社区的帖子中越来越多地重复出现,因此我将以最快的速度介绍这些步骤。

  • 购买 AWS S3 存储桶
  • 启动 InterSystems OMOP,添加桶配置
  • 从 InterSystems OMOP 部署中弹出策略
  • 将策略应用到 AWS S3 存储桶

 

我不知道,这些步骤和图像在我的脑海中似乎更好用,但也许不是。 这里有文档,这里有一个更深入的方法,可以在本系列中用更好的示例来解决这个问题。

第二步:在谷歌云医疗 API 中添加发布/订阅(Pub/Sub)目标

如前所述,实现这一功能的基础是数据存储中的资源变更通知这一超级强大的功能。 您可以在对话框中的设置中找到此选项,也可以在配置后使用。 我通常喜欢选中这两个选项,以便在通知中提供尽可能多的数据。 例如,在删除时,您可以在通知中包含已删除的资源,这对于 EMPI 解决方案来说非常重要。

第三步:云功能 ⭐

云功能需要投入工作,其 SOW 看起来有点像这样。

在创建方法上监听组织类型的 FHIR 资源更改发布/子通知,并从事件触发时起增量导出数据存储。 由于导出功能仅支持 GCS 目标,因此读入创建的导出并创建 fhir 导出压缩文件,将 ndjson 文件压缩到压缩文件根目录,然后将创建的压缩文件推送到 aws bucket。

再次说明第二个让它特别出色的功能,那就是从特定日期和时间导出的功能,这意味着我们不需要导出整个数据集。 为此,我们将使用收到事件的时间,再加上一分钟左右,希望导出、导入和转换的步骤更少,当然也更及时。

 
realtimefhir2omop.py

第四步:现在正在发生什么?

为了分清发生了什么,让我们通过每一点的截图来检查实时处理情况。

创建 FHIR Organization

发布/订阅(Pub/Sub)事件已发布

 
发布/订阅 FHIR 事件

云功能从订阅中接收资源事件

云功能导出 FHIR 存储 GCS

云功能从 GCS 创建 ZIP 并推送至 AWS

InterSystems OMOP 将 FHIR 转换为 OMOP

组织可在 CDM 中作为护理站点使用

FHIR 资源是何时转换到 CDM 的?

YARN | Now. You're looking at now. Everything that happens now is happening  now. | Spaceballs (1987) | Video gifs by quotes | 1606b976 | 紗

第四步:验证乐趣

OBS 的趣味性和音频的不确定性(注意:视频来源YouTube,请移步至原帖查看)

总结

去年在MIT Grand Hack 上也做过类似的事情,使用的是相同的设计模式,但中间使用了 Questionairre/Response 资源和 Gemini。

Gemini FHIR Agent MIT Grand Hack

Discussion (0)1
Log in or sign up to continue