框架一直是敏捷开发中的利器,能让开发者很快的上手并做出应用,甚至有的时候,脱离了框架,一些开发者都不会写程序了。成长总不会一蹴而就,从写出程序获取成就感,再到精通框架,快速构造应用,当这些方面都得心应手的时候,可以尝试改造一些框架,或是自己创造一个。
Gin是一个golang的微框架,封装比较优雅,API友好,源码注释比较明确,已经发布了1.0版本。具有快速灵活,容错方便等特点。其实对于golang而言,web框架的依赖要远比Python,Java之类的要小。自身的net/http足够简单,性能也非常不错。框架更像是一些常用函数或者工具的集合。借助框架开发,不仅可以省去很多常用的封装带来的时间,也有助于团队的编码风格和形成规范。
gin框架不是内置的,要去github上拉取
go get -u “github.com/gin-gonic/gin”
既然是框架就不过多赘述,直接上手吧
开始使用,主要讲controller层
一般情况下
我们以 r := gin.Default() 开始 //内置了Logger和Default
Default returns an Engine instance with the Logger and Recovery middleware already attached.
以 r.Run() 为程序启动,默认的是8080端口
统一管理不存在的路由,很多时候都是返回404
r.LoadHTMLFiles("./login.html", "./fileUpload.html")
前端页面都是要提前加载到gin中的,才可以被渲染,不然直接调用就是notfound
func main() {
r := gin.Default()
r.LoadHTMLFiles( "./404.html")
r.NoRoute(func(ctx *gin.Context) {
ctx.HTML(http.StatusNotFound, "404.html", nil)
})
r.Run()
}
方便管理可以统一设置路由组,并可以简单的用restful风格进行开发
r.Any("/user", func(ctx *gin.Context) 可以匹配所有方式的请求
//路由组嵌套
bookGroup := r.Group("/book")
{
bookGroup.GET("/index", func(ctx *gin.Context) {
ctx.JSON(http.StatusOK, gin.H{
"key": "index",
})
})
bookGroup.GET("/index2", func(ctx *gin.Context) {
ctx.JSON(http.StatusOK, gin.H{
"key": "index2",
})
})
//restful风格
bookGroup.GET("/", func(ctx *gin.Context) {
ctx.String(http.StatusOK, "getBook")
})
bookGroup.POST("/", func(ctx *gin.Context) {
ctx.String(http.StatusOK, "addBook")
})
bookGroup.PUT("/", func(ctx *gin.Context) {
ctx.String(http.StatusOK, "updateBook")
})
bookGroup.DELETE("/", func(ctx *gin.Context) {
ctx.String(http.StatusOK, "deleleBook")
})
}
参数获取
//get请求下获取参数
name := ctx.Query("aa") //可以获取参数
name := ctx.DefaultQuery("aa","bb") //没有aa的参数就直接用bb这个值代替
name, ok := ctx.GetQuery("aa") //不存在会返回false
//post请求下获取参数
username := ctx.PostForm("username") //和get的参数取得方式不一样了
username := ctx.DefaultPostForm("username", "master_sxj") //没有username就用默认的
username, ok := ctx.GetPostForm("username")//不存在时返回false
rest风格下的get 请求
//restful风格,顺便参数绑定
r.GET("/hi/:name/:age", func(ctx *gin.Context) {
//获取url参数
name := ctx.Param("name")
age := ctx.Param("age")
ctx.JSON(http.StatusOK, gin.H{
"name": name,
"age": age,
})
})
参数绑定,很方便的把前端传过来的json转化为struct
//参数绑定
var u Account
err := ctx.ShouldBind(&u) //改变参数的值,必须传地址
重定向
r.GET("/test", func(ctx *gin.Context) {
ctx.Redirect(http.StatusMovedPermanently,"https://www.baidu.com")
})
路由重定向,如登陆失败的时候等会涉及到
r.GET("/login", func(ctx *gin.Context) {
//...
//登陆失败跳回来
ctx.Request.URL.Path = "/login"
r.HandleContext(ctx)
})
渲染回前端
返回一个html页面:
ctx.HTML(http.StatusOK, "login.html", nil)
返回json格式的字符串:
ctx.JSON(http.StatusOK, data) //data封装一个json字符串
简单的介绍了一下gin的视图层操作,以后继续补充~
有问题望指正

1500

被折叠的 条评论
为什么被折叠?



