Grule前端表单post后端执行grule引擎规则
编写test.go执行grule引擎规则
- 示例都是
go test
执行的测试代码,所以将里面的测试代码去除 - 由于之前
NumberExponentExample_test.go
已经验证可运行, 所以将 err
的异常处理去除
package mainimport ("log""github.com/hyperjumptech/grule-rule-engine/ast""github.com/hyperjumptech/grule-rule-engine/builder""github.com/hyperjumptech/grule-rule-engine/engine""github.com/hyperjumptech/grule-rule-engine/pkg"
)type ExponentData struct {Check float64Set float64
}const ExponentRule = `
rule ExponentCheck "User Related Rule" salience 10 {when ExponentData.Check == 6.67428e-11ThenExponentData.Set = .12345E+5;Retract("ExponentCheck");
}
`func main() {exponent := &ExponentData{Check: 6.67428e-11,Set: 0,}dataContext := ast.NewDataContext()dataContext.Add("ExponentData", exponent)lib := ast.NewKnowledgeLibrary()rb := builder.NewRuleBuilder(lib)rb.BuildRuleFromResource("TestExponent", "1.0.0", pkg.NewBytesResource([]byte(ExponentRule)))eng1 := &engine.GruleEngine{MaxCycle: 5}kb, _ := lib.NewKnowledgeBaseInstance("TestExponent", "1.0.0")eng1.Execute(dataContext, kb)log.Println(exponent)
}
- 运行结果: 结构体
ExponentData
的 Set
字段被设置为了 12345
$ go run test.go
2024/12/05 01:22:59 &{6.67428e-11 12345}
部署gin和加载模板引擎
- gin中文文档:
https://learnku.com/docs/gin-gonic/1.7
- 下载
gin
模块
go get -u github.com/gin-gonic/gin
package mainimport ("net/http""github.com/gin-gonic/gin"
)func main() {r := gin.Default()r.LoadHTMLGlob("templates/*")r.GET("/index", func(c *gin.Context) {c.HTML(http.StatusOK, "index.tmpl", gin.H{})})r.Run()
}
- 创建
templates
目录, 然后添加 index.tmpl
模板
mkdir -p templates && touch templates/index.tmpl
编写前端表单
- 编写表单, 往后端
/number/
接口发送 post
请求
<html><form action="/number/" method="POST" ><textarea name="textarea"></textarea><input type="submit" value="Submit"></form>
</html>
- 启动项目访问
localhost:8080/index
会看到一个文本框
go run main.go

编写后端接口
- 编写
/number/
的后端接口, 运行Grule规则
import ("github.com/hyperjumptech/grule-rule-engine/ast""github.com/hyperjumptech/grule-rule-engine/builder""github.com/hyperjumptech/grule-rule-engine/engine""github.com/hyperjumptech/grule-rule-engine/pkg"
)type ExponentData struct {Check float64Set float64
}func main() {r.POST("/number/", func(c *gin.Context) {textareaContent := c.PostForm("textarea")exponent := &ExponentData{Check: 6.67428e-11,Set: 0,}dataContext := ast.NewDataContext()dataContext.Add("ExponentData", exponent)lib := ast.NewKnowledgeLibrary()rb := builder.NewRuleBuilder(lib)rb.BuildRuleFromResource("TestExponent", "1.0.0", pkg.NewBytesResource([]byte(textareaContent)))eng1 := &engine.GruleEngine{MaxCycle: 5}kb, _ := lib.NewKnowledgeBaseInstance("TestExponent", "1.0.0")eng1.Execute(dataContext, kb)c.JSON(http.StatusOK, gin.H{"textareaContent": exponent.Set,})})
}
验证表单传入Grule能否执行规则
- 重启项目, 访问
localhost:8080/index
, 将Grule规则放入文本框提交
rule ExponentCheck "User Related Rule" salience 10 {when ExponentData.Check == 6.67428e-11ThenExponentData.Set = .12345E+5;Retract("ExponentCheck");
}

- 结果能返回
exponent
的 Set
字段值: 12345

完整代码
package mainimport ("net/http""github.com/gin-gonic/gin""github.com/hyperjumptech/grule-rule-engine/ast""github.com/hyperjumptech/grule-rule-engine/builder""github.com/hyperjumptech/grule-rule-engine/engine""github.com/hyperjumptech/grule-rule-engine/pkg"
)type ExponentData struct {Check float64Set float64
}func main() {r := gin.Default()r.GET("/ping", func(c *gin.Context) {c.JSON(200, gin.H{"message": "pong",})})r.LoadHTMLGlob("templates/*")r.GET("/index", func(c *gin.Context) {c.HTML(http.StatusOK, "index.tmpl", gin.H{})})r.POST("/number/", func(c *gin.Context) {textareaContent := c.PostForm("textarea")exponent := &ExponentData{Check: 6.67428e-11,Set: 0,}dataContext := ast.NewDataContext()dataContext.Add("ExponentData", exponent)lib := ast.NewKnowledgeLibrary()rb := builder.NewRuleBuilder(lib)rb.BuildRuleFromResource("TestExponent", "1.0.0", pkg.NewBytesResource([]byte(textareaContent)))eng1 := &engine.GruleEngine{MaxCycle: 5}kb, _ := lib.NewKnowledgeBaseInstance("TestExponent", "1.0.0")eng1.Execute(dataContext, kb)c.JSON(http.StatusOK, gin.H{"textareaContent": exponent.Set,})})r.Run()
}