Rechercher

Article
· Nov 12 6m de lecture

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
Connectez-vous ou inscrivez-vous pour continuer
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
Connectez-vous ou inscrivez-vous pour continuer
Article
· Nov 11 5m de lecture

终于等到你:欢迎了解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
Connectez-vous ou inscrivez-vous pour continuer
Article
· Nov 11 3m de lecture

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
Connectez-vous ou inscrivez-vous pour continuer
Article
· Nov 11 31m de lecture

将一切结合在一起:Go、GORM 和 InterSystems IRIS 的实际应用

对于使用 InterSystems IRIS 的 Go 开发人员来说,我们已经达到了两个重要的里程碑:

现在是时候看看一切如何协同工作了。

为了演示 Go 开发人员可以如何轻松地采用 InterSystems IRIS,我使用了一个现有的生产级开源项目——RealWorld 示例应用程序——它展示了使用Go FiberGORMSQLite 实现的 Medium.com 式全栈克隆。

RealWorld Example App

只需稍作配置调整,我就将 SQLite 换成了gorm-iris,其他一切保持不变。结果如何?
一个由 InterSystems IRIS 支持的功能齐全的 Go + Fiber 应用程序——不需要重写代码,不需要 ORM 体操,只需要一个不同的数据库后端。

您可以在这里找到完整的工作演示:github.com/caretdev/golang-fiber-iris-realworld-example-app

开始使用

让我们运行演示项目。


1.克隆项目

git clone git@github.com:caretdev/golang-fiber-iris-realworld-example-app.git 
cd golang-fiber-iris-realworld-example-app

2.下载依赖项并生成 Swagger 文档

安装 Go 依赖项并生成 API 文档:

go mod download 
go install github.com/swaggo/swag/cmd/swag@latest 
go generate .

这将

  • 下载所有需要的 Go 模块。
  • 安装用于生成 Swagger 文档的 swag 工具。
  • 执行 Go generate 命令,根据代码库中的注释重建 Swagger 定义。

运行该命令后,您将在 docs/ 目录下看到生成的文档文件。

3.数据库设置和测试

该项目包含一个 db.go 文件,其中定义了初始化数据库连接的逻辑。
为了简化测试并确保环境整洁,我们使用了testcontainers-iris-go——它会为每次测试运行启动一个全新的 InterSystems IRIS 容器

这意味着每次测试都从一个空的、隔离的 IRIS 实例开始,是可靠的自动测试的理想选择。

以下是实现该功能的核心代码部分:

var container *iriscontainer.IRISContainer

func TestDB(useContainer bool) *gorm.DB {
	var err error
	var connectionString = "iris://_SYSTEM:SYS@localhost:1972/USER"
	if useContainer {
		options := []testcontainers.ContainerCustomizer{
			iriscontainer.WithNamespace("TEST"),
			iriscontainer.WithUsername("testuser"),
			iriscontainer.WithPassword("testpassword"),
		}
		ctx := context.Background()
		container, err = iriscontainer.RunContainer(ctx, options...)
		if err != nil {
			log.Println("Failed to start container:", err)
			os.Exit(1)
		}
		connectionString = container.MustConnectionString(ctx)
		fmt.Println("Container started: ", connectionString)
	}

	newLogger := logger.New(
		log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer
		logger.Config{
			SlowThreshold: time.Second,  // Slow SQL threshold
			LogLevel:      logger.Error, // Log level
			Colorful:      true,         // Disable color
		},
	)

	db, err := gorm.Open(iris.New(iris.Config{
		DSN: connectionString,
	}), &gorm.Config{
		Logger: newLogger,
	})
	if !useContainer {
		_ = db.Exec("DROP DATABASE TEST").Error
		_ = db.Exec("CREATE DATABASE TEST").Error
		_ = db.Exec("USE DATABASE TEST").Error
	}

	if err != nil {
		fmt.Println("storage err: ", err)
	}
	return db
}

func DropTestDB() error {
	if container != nil {
		container.Terminate(context.Background())
	}
	container = nil
	return nil
}

func AutoMigrate(db *gorm.DB) {
	db.AutoMigrate(
		&model.User{},
		&model.Follow{},
		&model.Article{},
		&model.Comment{},
		&model.Tag{},
	)
}

使用容器化 IRIS 在 cli 标志下设置,并在 handler_test.go 文件中设置

var (
	useContainer bool
)

func TestMain(m *testing.M) {
	flag.BoolVar(&useContainer, "container", true, "Use container image.")
	flag.Parse()
	// setup()
	code := m.Run()
	// tearDown()
	os.Exit(code)
}

func setup() {
	d = db.TestDB(useContainer)
	db.AutoMigrate(d)
	us = store.NewUserStore(d)
	as = store.NewArticleStore(d)
	h = NewHandler(us, as)
	e = router.New()
	loadFixtures()
}

工作原理

  • useContainertrue 时,函数会通过 testcontainers-iris-go 启动一个新的 IRIS 容器。
    • 它将创建一个带有自定义凭据(testuser / testpassword)和名为 TEST 的命名空间的干净环境。
    • 连接字符串通过 container.MustConnectionString(ctx) 自动获取。
  • 在本地运行而不使用容器时,代码会连接到预先存在的 IRIS 实例,并确保在测试运行前重新创建 TEST 数据库。
  • AutoMigrate()会使用项目中定义的模型(UserArticleComment 等)自动创建所有需要的表。

4.运行测试

数据库配置就绪后,就可以使用以下工具执行所有测试:

go test ./handler -v

可以添加 -container 或 -container=0 标志来改变测试方式

此命令将

  • 以冗长模式编译并运行所有 Go 测试。
  • 为每个测试启动一个新的 IRIS 容器(如果启用)。
  • 自动应用迁移并在完成后进行清理。

如果一切配置正确,你会看到类似以下的日志输出:

 
测试结果

5.使用 Docker Compose 运行应用程序

确认测试成功通过后,下一步就是使用 Docker运行完整的 Fiber + GORM + IRIS 应用程序
在此设置中,Go 后端被构建成二进制文件,复制到 IRIS 容器中,并与 IRIS 本身一起自动启动。

这种方法使部署变得极其简单——只需一条命令就能启动一切。


已更新 docker-compose.yml

该项目的修改版 docker-compose.yml 现在定义了一个iris 服务,可同时处理这两种情况:

  • 运行InterSystems IRIS数据库。
  • 作为同一容器的一部分启动Go Fiber 应用程序

关键在于

  • Go 应用程序使用多级 Docker 构建。
  • 生成的二进制文件被复制到 IRIS 映像中。
  • 其中包含一个小的init 脚本,用于在 IRIS 启动时自动启动 Go 应用程序。

这样,你就有了一个自足的容器——一个能同时运行IRISGo Web API的单一镜像,两者完全同步。


构建并启动应用程序

要构建 IRIS 映像并启动环境,只需运行

docker compose up -d iris --build

这将

  1. 构建 Go 应用程序。
  2. 创建一个新的基于 IRIS 的 Docker 映像,其中包含应用程序二进制文件和初始化脚本。
  3. 以分离模式 (-d) 启动容器,同时运行 IRIS 和 Go API。

💡注意:
Go的一个美妙之处在于,您不必局限于将应用程序嵌入 IRIS 容器。
得益于 Go 的单二进制编译,您可以轻松地为您的应用程序构建一个独立的 Docker 镜像,该镜像可以使用相同的连接字符串通过网络连接到 InterSystems IRIS。

这种方法有两大优势:

  • 生成的映像更小,通常不到 30 MB。
  • 它将应用逻辑数据库基础架构干净利落地分离开来,是微服务或云部署的理想选择。

在生产过程中,你可以将 IRIS 和 Go 服务放在不同的容器(甚至不同的主机)中,通过网络安全地连接起来--将 IRIS 的可靠性和 Go 的可移植性结合起来。

6.使用 Newman 进行端到端 API 测试

Go + IRIS 应用程序启动并运行后,就需要验证 REST API 是否完全按照预期运行。
该项目包括一层额外的集成测试——使用原始 RealWorld 项目中的Postman / Newman集合

这将确保后端完全符合 RealWorld API 规范,并确保所有端点在 InterSystems IRIS 支持下正常工作。


Newman即服务

为了实现无缝测试,docker-compose.yml 文件定义了一个名为newman-checker 的额外服务。
该服务在容器内运行Newman CLI,执行完整的 RealWorld API 测试集,并在内部连接到运行中的 Fiber + IRIS 应用程序。

由于这两个服务都在同一个 Docker 网络中运行,因此测试可以直接访问后端,无需任何额外配置。


运行 API 测试

要执行端到端测试,只需运行

docker compose run newman-checker

这将

  1. 启动Newman容器。
  2. 将其连接到运行中的 iris 服务。
  3. 针对 Go + IRIS 后端执行整个 RealWorld API 测试套件。

如果一切设置正确,你应该会看到如下摘要:

 
Newman测试结果

这证实了什么

通过 Newman 套件意味着您的 Go + Fiber + GORM + IRIS 协议栈与 RealWorld API 规范完全兼容--这是一个很好的指标,表明您的后端逻辑、ORM 集成和数据库连接都能按预期运行。
这是一个很好的指标,表明您的后端逻辑、ORM 集成和数据库连接都能按预期运行。

这不再只是一个演示,而是一个由InterSystems IRIS 支持的符合规范的生产级后端

7.使用 Swagger UI 探索应用程序接口

一切就绪并开始运行后,你终于可以通过一个简洁的交互式界面来探索实时 REST API 了。
该项目附带了一个预生成的 Swagger UI,可以直接在浏览器中轻松检查和测试端点。

启动应用程序后,打开

👉 http://localhost:8585/swagger/index.html

您将看到完整的 RealWorld API 规范 - 所有端点均由Go Fiber后端提供支持,并通过GORMInterSystems IRIS 相连。

从这里,您可以

  • 注册和登录用户
  • 创建、编辑和删除文章
  • 发表评论
  • 关注或取消关注用户

通过新的 Go 驱动程序和 ORM 集成,IRIS 可实时处理您发送的所有请求。

下一步计划

您现在已经构建并运行了一个完整的Go + Fiber + GORM + IRIS后端--包括自动化测试、Swagger 文档和容器化部署。
自动化测试、Swagger 文档和容器化部署。

从这里,您可以

  • 用自己的功能扩展应用程序。
  • 将 IRIS 和 Go 应用程序作为单独的服务部署,以提高可扩展性。
  • 尝试使用高级 IRIS 功能--全局、分析和互操作性。

该演示表明,InterSystems IRIS可以成为现代 Go 生态系统中的一等公民--功能强大、速度快,并可用于云计算。
功能强大、速度快,可用于云原生应用程序。


该项目正在参与竞赛,请在此投票。

Discussion (0)1
Connectez-vous ou inscrivez-vous pour continuer