深入浅出Gin框架搭建HTTP服务

简介: Gin是一个用Golang写的网络框架。它有一个马提尼式的API,性能更好,速度快40倍。如果您需要性能和良好的生产力,您会喜欢Gin。

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)
})

测试:
image.png

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

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

测试:
image.png

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)
    }
}

~

相关文章
|
1月前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
130 3
|
3月前
|
Java Maven Windows
使用Java创建集成JACOB的HTTP服务
本文介绍了如何在Java中创建一个集成JACOB的HTTP服务,使Java应用能够调用Windows的COM组件。文章详细讲解了环境配置、动态加载JACOB DLL、创建HTTP服务器、实现IP白名单及处理HTTP请求的具体步骤,帮助读者实现Java应用与Windows系统的交互。作者拥有23年编程经验,文章来源于稀土掘金。著作权归作者所有,商业转载需授权。
使用Java创建集成JACOB的HTTP服务
|
2月前
|
前端开发 JavaScript 中间件
前端全栈之路Deno篇(四):Deno2.0如何快速创建http一个 restfulapi/静态文件托管应用及oak框架介绍
Deno 是由 Node.js 创始人 Ryan Dahl 开发的新一代 JavaScript 和 TypeScript 运行时,旨在解决 Node.js 的设计缺陷,具备更强的安全性和内置的 TypeScript 支持。本文介绍了如何使用 Deno 内置的 `Deno.serve` 快速创建 HTTP 服务,并详细讲解了 Oak 框架的安装和使用方法,包括中间件、路由和静态文件服务等功能。Deno 和 Oak 的结合使得创建 RESTful API 变得高效且简便,非常适合快速开发和部署现代 Web 应用程序。
115 2
|
2月前
|
JSON Java fastjson
Java Http 接口对接太繁琐?试试 UniHttp 框架吧
UniHttp 是一个声明式的 HTTP 接口对接框架,旨在简化第三方 HTTP 接口的调用过程。通过注解配置,开发者可以像调用本地方法一样发起 HTTP 请求,无需关注请求的构建和响应处理细节。框架支持多种请求方式和参数类型,提供灵活的生命周期钩子以满足复杂的对接需求,适用于企业级项目的快速开发和维护。GitHub 地址:[UniAPI](https://github.com/burukeYou/UniAPI)。
|
2月前
|
关系型数据库 MySQL 数据库
vertx 的http服务表单提交与mysql验证
本文介绍了如何使用Vert.x处理HTTP服务中的表单提交,并通过集成MySQL数据库进行验证,包括项目依赖配置、表单HTML代码和完整的Vert.x服务代码。
25 2
|
3月前
|
存储 JSON Go
在Gin框架中优雅地处理HTTP请求体中的JSON数据
在Gin框架中优雅地处理HTTP请求体中的JSON数据
|
2月前
|
Java 数据处理 开发者
Java Http 接口对接太繁琐?试试 UniHttp 框架~
【10月更文挑战第10天】在企业级项目开发中,HTTP接口对接是一项常见且重要的任务。传统的编程式HTTP客户端(如HttpClient、Okhttp)虽然功能强大,但往往需要编写大量冗长且复杂的代码,这对于项目的可维护性和可读性都是一个挑战。幸运的是,UniHttp框架的出现为这一问题提供了优雅的解决方案。
96 0
|
4月前
|
负载均衡 中间件 Go
五分钟给你的 gRPC 服务加上 HTTP 接口
五分钟给你的 gRPC 服务加上 HTTP 接口
|
5月前
|
Java Spring
spring cloud gateway在使用 zookeeper 注册中心时,配置https 进行服务转发
spring cloud gateway在使用 zookeeper 注册中心时,配置https 进行服务转发
126 3
|
7月前
|
域名解析 网络协议 应用服务中间件
阿里云服务器配置免费https服务
阿里云服务器配置免费https服务
下一篇
DataWorks