1、Gin 快速开发
1.1、环境准备
1.1.1、导入 gin 依赖
这里就叫 gin 依赖了,在 Goland 命令行中输入下面的命令:
go get -u github.com/gin-gonic/gin
1.1.2、设置代理
如果下载失败,最好设置一下代理,在 cmd 命令行中输入下面的命令:
go env -w GOPROXY=https://goproxy.cn,direct
完了之后再 Goland 这里同样设置启用 environment:
1.2、快速开发
1.2.1、Hello world
package main import "github.com/gin-gonic/gin" func main() { // 创建一个服务 ginServer := gin.Default() // todo Go语言中的处理请求方法都是函数式编程:第一个参数是请求地址 第二个请求是函数 // 访问地址,处理请求 ginServer.GET("/hello", func(context *gin.Context) { context.JSON(200,gin.H{"msg":"hello world"}) }) // 设置服务器端口 ginServer.Run(":8082") // 默认 8080 }
上面,我们首先得到了 ginServer ,然后直接通过函数式编程,给 GET 请求 "/hello" 设置处理函数:直接返回给前端一段 JSON 数据。
这个返回格式和我们之前学习的 SpringBoot 是不谋而合的,它们都会返回一个状态码和一段任意类型的信息(在 SpringBoot 中是 Object,在这里是 any 类型)。
启动程序,访问 localhost:8082:
1.2.2、给网页设置 icon
直接在 Goland 命令行输入:go get "github.com/thinkerou/favicon":
直接在上面的代码基础上添加下面的代码:
import( "github.com/thinkerou/favicon" )
在 main 方法中添加一行代码即可:
// 设置网页icon ginServer.Use(favicon.New("./sxau.ico"))
测试:
// todo 新增用户 ginServer.POST("/user", func(ctx *gin.Context) { ctx.JSON(200,gin.H{ "msg":"新增用户", }) })
1.2.3、给前端响应界面
1、加载 HTML 文件
有两种方法,一种是加载 html 所在目录下所有文件,一种是加载单个 html 文件:
// 加载静态页面 ginServer.LoadHTMLGlob("static/html/*") //ginServer.LoadHTMLFiles("static/index.html") // 加载指定的 HTML 文件
2、加载 css、js
// 加载资源文件 css、js ginServer.Static("/static","./static")
此外,我们可以看到每次运行,Go 都会把我们的程序打包为一个 exe(windows),在 linux 和 mac 上同样会直接打包为一个可执行文件,所以特别方便!
1.2.4、获取请求中的参数
1)& ?格式
// 1. /user?user_id=xxx&username=xxx 格式 ginServer.GET("/user", func(ctx *gin.Context) { user_id := ctx.Query("user_id") username := ctx.Query("username") ctx.JSON(http.StatusOK,gin.H{ "user_id": user_id, "username": username, }) })
2)RESTful 风格
SpringBoot 中我们使用 /user/{user_id} 的格式来传递参数,go 语言中我们使用 :user_id 来传递
// 2. /user/user_id/username ginServer.GET("/user/:user_id/:username", func(ctx *gin.Context) { user_id := ctx.Param("user_id") username := ctx.Param("username") ctx.JSON(http.StatusOK,gin.H{ "user_id": user_id, "username": username, }) })
1.2.5、序列化数据
把前端发来的数据(已经不是 json 了)转为 json 再返回:
// todo 前端给后端传递 json ginServer.POST("/json", func(ctx *gin.Context) { // 从请求体(request.body)获得对象 // GetRawData() 返回请求体切片[]byte和错误信息err data,err := ctx.GetRawData() fmt.Println("date => "+string(data)) fmt.Println("err => ",err) var m map[string]interface{} // 序列化包装为json数据 _ = json.Unmarshal(data,&m) ctx.JSON(http.StatusOK,m) })
1.2.6、获取表单数据
// todo 新增用户 ginServer.POST("/user", func(ctx *gin.Context) { // 对应表单的input标签的name属性 username := ctx.PostForm("username") password := ctx.PostForm("password") ctx.JSON(200,gin.H{ "msg":"新增用户", "username":username, "password":password, }) })
1.2.5、路由之重定向到首页
重定向的状态码是 301 !
// todo 路由 ginServer.GET("/test", func(ctx *gin.Context) { // 重定向 301 ctx.Redirect(http.StatusMovedPermanently,"/index") })
1.2.6、路由之404页面
// 404 ginServer.NoRoute(func(ctx *gin.Context) { // 它会自动拼接 static/html/ ctx.HTML(http.StatusNotFound,"404.html",nil) })
1.2.7、路由之路由组
路由组就相当于我们 SpringBoot 中控制器类上面 @RequestMapping 的统一前缀:
// 路由组(RESTful 风格) book := ginServer.Group("/book") { // 相当于访问 /book/id book.GET("/:id", func(ctx *gin.Context) { }) // 相当于访问 /book/id book.DELETE("/:id", func(ctx *gin.Context) { }) }
Gin 框架的使用(2)https://developer.aliyun.com/article/1534252