快速入门Gin框架搭建HTTP服务

简介: 快速入门Gin框架搭建HTTP服务

1 概念

官网:https://gin-gonic.com/zh-cn/

What is Gin?

Gin is a web framework written in Golang.

It features a martini-like API with much better performance, up to 40 times faster.

If you need performance and good productivity, you will love Gin.

翻译:

Gin是一个用Golang写的网络框架。

它有一个马提尼式的API,性能更好,速度快40倍。

如果您需要性能和良好的生产力,您会喜欢Gin。

特点:

  • 快速:基于基树路由,内存占用小。没有反射。可预测的API的性能。
  • 中间件支持:传入的HTTP请求可以由中间件链和最终操作处理。例如:Logger, Authorization, GZIP,最后在DB中发布消息。
  • 轻松捕获故障:Gin可以捕捉到HTTP请求期间发生的恐慌并恢复它。 这样,您的服务器将始终可用。 也可以将这种恐慌报告给哨兵!
  • JSON验证:Gin可以解析和验证请求的JSON,例如检查需要的值是否存在。
  • 路线分组:更好地组织你的路线。 授权需要和不需要,不同的API版本。 此外,组可以无限制地嵌套而不会降低性能。
  • 错误管理:Gin提供了一种方便的方法来收集HTTP请求期间发生的所有错误。最终,中间件可以将它们写入日志文件、数据库并通过网络发送。
  • 内置渲染:Gin为JSON、XML和HTML渲染提供了一个易于使用的API。
  • 可扩展的:创建新的中间件非常简单,只需查看示例代码即可。

2 安装

go get -u github.com/gin-gonic/gin

3 初步使用

3.1 HelloWorld
package main
import "github.com/gin-gonic/gin"
func main() {
  r := gin.Default()
  r.GET("/Hello", func(c *gin.Context) {
    c.JSON(200, gin.H{
      "message": "HelloWorld",
    })
  })
    r.Run("127.0.0.1:8899") // 监听并在 0.0.0.0:8899 上启动服务
}

测试:

curl http://127.0.0.1:8899/hello
{"message": "HelloWorld"}
3.2 获取请求参数

(1)http://127.0.0.1:8899?name=zs型参数

r.GET("/name", func(c *gin.Context) {
    query := c.Query("name")
    //等价于:c.Request.URL.Query().Get("name")
    c.JSON(200, "Hello "+query)
})

测试:

curl http://127.0.0.1:8899/name?name=zs
"Hello zs"

(2)http://127.0.0.1:8899/name/{zs}型参数

r.GET("/name/:name", func(c *gin.Context) {
    name := c.Param("name")
    c.JSON(200, "Hello "+name)
})

测试:

curl http://127.0.0.1:8899/name/zs
"Hello zs"
3.3 获取请求体

(1)一般获取请求体

结构体:

type Student struct {
   Name string `json:"name"`
   Age  int    `json:"age"`
}

方法:

r.POST("/stu", func(c *gin.Context) {
   body := c.Request.Body
   bytes, err := ioutil.ReadAll(body)
   stu := Student{}
   json.Unmarshal(bytes, &stu)
   if err != nil {
      panic(err)
   }
   c.JSON(200, stu)
})

测试:

(2)获取请求体与结构体绑定

r.POST("/stu", func(c *gin.Context) {
   stu := Student{}
   // c.ShouldBindJSON 使用了 c.Request.Body,不可重用。
   c.ShouldBindJSON(&stu)
   c.JSON(200, stu)
})

测试:

3.4 路由组

路由组就好比一层配置,增加了一个层级,以便于区分不同分组的URL,例如下面的代码中,如果要请求FindAppInfoById方法,路径就是/appInfo/save,完整路径就是http://127.0.0.1:8899/appInfo/save

func main() {
  r := gin.Default()
  //路由组
  appInfoGroup := r.Group("/appInfo")
  {
    appInfoGroup.POST("/save", controller.SaveAppInfo)
    appInfoGroup.GET("/find/:id", controller.FindAppInfoById)
    appInfoGroup.GET("/findAll", controller.FindAllAppInfo)
  }
  r.Run("127.0.0.1:" + utils.IntToString(port))
}
// FindAppInfoById 自定义HTTP方法
func FindAppInfoById(c *gin.Context) {
  id := c.Param("id")
  ......
  c.JSON(200, id)
}
func SaveAppInfo(c *gin.Context) {
    ......
}
func FindAllAppInfo(c *gin.Context) {
    ......
}

4 Gin实现拦截器

func main() {
   r := gin.Default()
   //增加拦截器
   r.Use(interceptor.HttpInterceptor())
   ......
   r.Run("127.0.0.1:" + utils.IntToString(port))
}

拦截器实现:

// HttpInterceptor 自定义中间件
func HttpInterceptor() gin.HandlerFunc {
  return func(c *gin.Context) {
    t := time.Now()
    // 设置 example 变量
    c.Set("example", "12345")
    // 请求前
    log.Print("--------------拦截器-------------")
    //定义错误,终止并返回该JSON
    //c.AbortWithStatusJSON(500, "error")
    requestURI := c.Request.RequestURI
    fmt.Println(requestURI)
    //通过请求
    c.Next()
    // 请求后
    latency := time.Since(t)
    log.Print(latency)
    // 获取发送的 status
    status := c.Writer.Status()
    log.Println(status)
  }
}

~

相关文章
|
6月前
|
JSON 中间件 Go
Go 网络编程:HTTP服务与客户端开发
Go 语言的 `net/http` 包功能强大,可快速构建高并发 HTTP 服务。本文从创建简单 HTTP 服务入手,逐步讲解请求与响应对象、URL 参数处理、自定义路由、JSON 接口、静态文件服务、中间件编写及 HTTPS 配置等内容。通过示例代码展示如何使用 `http.HandleFunc`、`http.ServeMux`、`http.Client` 等工具实现常见功能,帮助开发者掌握构建高效 Web 应用的核心技能。
378 61
|
6月前
|
应用服务中间件 网络安全 数据安全/隐私保护
网关服务器配置指南:实现自动DHCP地址分配、HTTP服务和SSH无密码登录。
哇哈哈,道具都准备好了,咱们的魔术秀就要开始了。现在,你的网关服务器已经魔法满满,自动分配IP,提供网页服务,SSH登录如入无人之境。而整个世界,只会知道效果,不会知道是你在幕后操控一切。这就是真正的数字世界魔法师,随手拈来,手到擒来。
362 14
|
8月前
|
中间件 Go
Golang | Gin:net/http与Gin启动web服务的简单比较
总的来说,`net/http`和 `Gin`都是优秀的库,它们各有优缺点。你应该根据你的需求和经验来选择最适合你的工具。希望这个比较可以帮助你做出决策。
380 35
|
9月前
|
关系型数据库 MySQL PHP
源码编译安装LAMP(HTTP服务,MYSQL ,PHP,以及bbs论坛)
通过以上步骤,你可以成功地在一台Linux服务器上从源码编译并安装LAMP环境,并配置一个BBS论坛(Discuz!)。这些步骤涵盖了从安装依赖、下载源代码、配置编译到安装完成的所有细节。每个命令的解释确保了过程的透明度,使即使是非专业人士也能够理解整个流程。
272 18
|
存储 Web App开发 监控
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
我们以前使用过的对hbase和hdfs进行健康检查,及剩余hdfs容量告警,简单易用 1.针对hadoop2的脚本: #/bin/bashbin=`dirname $0`bin=`cd $bin;pwd`STATE_OK=...
1166 0
|
SQL Web App开发 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
在运行一个group by的sql时,抛出以下错误信息: Task with the most failures(4):  -----Task ID:  task_201411191723_723592_m_000004URL:  http://DDS0204.
1107 0
|
Web App开发 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
异步通信 对于BS(Browser-Server 浏览器)架构,很多情景下server的处理时间较长。 如果浏览器发送请求后,保持跟server的连接,等待server响应,那么一方面会对用户的体验有负面影响; 另一方面,很有可能会由于超时,提示用户服务请求失败。
856 0
|
Web App开发 前端开发 关系型数据库
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
fuser可用于查询文件、目录、socket端口和文件系统的使用进程 1.查询文件和目录使用者 fuser最基本的用法是查询某个文件或目录被哪个进程使用: # fuser -v .
999 0
|
Web App开发 前端开发