和其他框架集成

和其他框架集成

首先,amisgo 提供了 Handle 和 HandleFunc 方法来集成其他实现了 http.Handler 的实例。

假设我们的 UI 部分用 amisgo 定义,api 部分可以用标准库也可以用三方库比如 gin 来实现,可以这样写:

const (
	apiPrefix = "/api/"
	date      = "date"
)

func main() {
	dateApi := apiPrefix + date
	g := gin.Default()
	g.GET(dateApi, func(c *gin.Context) {
		c.JSON(200, model.SuccessResponse("", model.Data{"date": time.Now()}))
	})

	app := amisgo.New().
		Handle(apiPrefix, g).
		Mount("/", comp.Page().InitApi(dateApi).Body("Now: ${date}"))

	panic(app.Run("8888"))
}

又因为 amisgo 的 Egine 本身是一个 http.Handler,所以可以这样写:

func main() {
	dateApi := apiPrefix + date
	g := gin.Default()
	g.GET(dateApi, func(c *gin.Context) {
		c.JSON(200, model.SuccessResponse("", model.Data{"date": time.Now()}))
	})

	app := amisgo.New().
		Handle(apiPrefix, g).
		Mount("/", comp.Page().InitApi(dateApi).Body("Now: ${date}"))

	http.Handle("/", app)
	http.Handle(apiPrefix, g)
	panic(http.ListenAndServe(":8888", nil))
}

还可以将 amisgo 的 Engine 包装为 gin.HandlerFunc:

func main() {
	dateApi := apiPrefix + date
	g := gin.Default()
	g.GET(dateApi, func(c *gin.Context) {
		c.JSON(200, model.SuccessResponse("", model.Data{"date": time.Now()}))
	})

	app := amisgo.New().
		Handle(apiPrefix, g).
		Mount("/", comp.Page().InitApi(dateApi).Body("Now: ${date}"))

	g.GET("/", func(c *gin.Context) {
		app.ServeHTTP(c.Writer, c.Request)
	})

	panic(g.Run(":8888"))
}