gin框架初探 | 青训营笔记

59 阅读2分钟

这是我参与「第五届青训营 」笔记创作活动的第7天

前言

在参与完成大项目之前,我首先学习了gin这一常用的http框架的基本使用

1.Gin介绍

Gin 是一个用 Go (Golang) 编写的 HTTP Web 框架。 它具有类似 Martini 的 API,但性能比 Martini 快 40 倍。

下载gin:

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

将gin引入到代码中:

import "github.com/gin-gonic/gin"

2.第一个gin网站 示例 以下展示一个最小的gin web程序

package main

import (
	"github.com/gin-gonic/gin"
)

// hello 路径的函数
func sayHello(c *gin.Context) {
	c.JSON(200, gin.H{
		"message": "hello gin!",
	}) // 返回一个JSON数据
}

func main() {
	r := gin.Default() // 返回默认的路由引擎

	// 指定用户使用GET请求访问/hello时,执行sayHello函数
	r.GET("hello/", sayHello)

	// 启动服务
	r.Run()
}

启动程序之后,浏览器访问:

http://127.0.0.1:8080/hello/

输出信息:

{"message":"hello gin!"} 1 RESTful API REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移”或“表现层状态转化”。

简单来说,REST的含义就是客户端与Web服务器之间进行交互的时候,使用HTTP协议中的4个请求方法代表不同的动作。

  • GET用来获取资源

  • POST用来新建资源

  • PUT用来更新资源

  • DELETE用来删除资源。

只要API程序遵循了REST风格,那就可以称其为RESTful API。目前在前后端分离的架构中,前后端基本都是通过RESTful API来进行交互。

获取body内容值

package main

import (
	"bytes"
	"github.com/gin-gonic/gin"
	"io/ioutil"
	"net/http"
)
/**
获取body内容
 */
func main(){
	r:=gin.Default()
	r.POST("/test", func(context *gin.Context) {
		//拿到body的字节内容
		bodyByts,err:=ioutil.ReadAll(context.Request.Body)
		if err != nil {
			//如果抛异常则打印错误
			context.String(http.StatusBadRequest,err.Error())
			context.Abort()
		}else{
			/**
			正确则输出正确内容
			 */
			context.Request.Body = ioutil.NopCloser(bytes.NewBuffer(bodyByts))
			firstName:=context.PostForm("firstName")
			lastName:=context.DefaultPostForm("lastName","default")
			context.String(200,"%s,%s,%s",firstName,lastName,string(bodyByts))

		}
	})
	r.Run()
}

获取get请求参数

package main

import "github.com/gin-gonic/gin"

func main(){
	//声明gin实例
	r:=gin.Default()
	r.GET("/test", func(context *gin.Context) {
		//获取第一个参数
		firstName := context.Query("first_name")
		//获取第二个参数,有默认值
		lastName := context.DefaultQuery("last_name",
			"last_default_name")
		context.String(200,"%s,%s",firstName,lastName)
	})
	r.Run()
}

分组

什么是分组

  • 对 router 创建 Group 就是分组,同一分组会拥有同一前缀和同一中间件

如何创建路由组

router := gin.Default()

// 简单的路由组: v1
v1 := router.Group("/v1")
{
  v1.POST("/login", loginEndpoint)
  v1.POST("/submit", submitEndpoint)
  v1.POST("/read", readEndpoint)
}

// 简单的路由组: v2
v2 := router.Group("/v2")
{
  v2.POST("/login", loginEndpoint)
  v2.POST("/submit", submitEndpoint)
  v2.POST("/read", readEndpoint)
}

为什么要分组

  • 让路由结构更加清晰,更加方便的管理路由

总结

gin使用起来十分简洁,开发高效,也支持中间件和模板渲染。