golangWeb框架---github.com/gin-gonic/gin学习一(路由、多级路由、参数传递几种形式)

文章目录

      • Gin介绍
      • 安装
      • 快速开始
      • 路径参数
      • 构造参数
      • post传参
      • get+post混合形式
      • 构造Map格式
      • 分组路由

Gin介绍

Gin是一个golang的微框架,封装比较优雅,API友好,源码注释比较明确,已经发布了1.0版本。具有快速灵活,容错方便等特点。其实对于golang而言,web框架的依赖要远比Python,Java之类的要小。自身的net/http足够简单,性能也非常不错。框架更像是一些常用函数或者工具的集合。借助框架开发,不仅可以省去很多常用的封装带来的时间,也有助于团队的编码风格和形成规范。

安装

下载安装

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

项目中导入

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

(可选)导入NET/HTTP。例如,如果使用诸如HTTP.StasuCK之类的常数,则需要这样做。

import "net/http"

快速开始

让我们先通过一个简单的例子,迅速的了解以下
以下demo代码摘自Gin的github实例

package main
import "github.com/gin-gonic/gin"
func main() {
	r := gin.Default()
	r.GET("/ping", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "pong",
		})
	})
	r.Run()
}

通过$ go run quick.go 启动
然后浏览器输入http://0.0.0.0:8080/ping
浏览器会渲染输出为:{"message":"pong"}
在这里插入图片描述

当然我们还可以利用如下的方式,渲染浏览器页面输出字符串

package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
)
func main() {
	router := gin.Default()

	router.GET("/someGet", getting)
	router.Run()
}
func getting(c *gin.Context){
	c.String(http.StatusOK,"Hello gin")
}

浏览器会渲染输出为:Hello gin

我们点开源码发现,不管是渲染输出json格式、还是简单的字符串都是调用了c.Render方法,以下只是列出了2种,还有其他的诸如HTML、IndentedJSON、SecureJSON、JSONP、AsciiJSON、XML、YAML、ProtoBuf等

func (c *Context) String(code int, format string, values ...interface{}) {
	c.Render(code, render.String{Format: format, Data: values})
}
func (c *Context) JSON(code int, obj interface{}) {
	c.Render(code, render.JSON{Data: obj})
}

路径参数



func main() {
	router := gin.Default()

	router.GET("/someGet/:name", getting)
	router.Run()
}


func getting(c *gin.Context){
	name:=c.Param("name")
	c.String(http.StatusOK,"Hello%s",name)
}

以上函数的路由将会匹配 /user/john格式,但是不回匹配 /user/ 或者 /user
所以我们浏览器输入http://0.0.0.0:8080/someGet/aaaa可以
http://0.0.0.0:8080/someGet/或者http://0.0.0.0:8080/someGet都报错误

以上是一个参数,我们还可以定义多级参数,例如下面的例子:

以上的路由函数可以匹配 /user/john/ 或者 /user/john/send
但是不会匹配 /user/john, 报异常
例如浏览器输入http://0.0.0.0:8080/someGet/aaaa/,页面输出Helloaaaa-/
例如浏览器输入http://0.0.0.0:8080/someGet/aaaa/gg,页面输出Helloaaaa-/gg
例如浏览器输入http://0.0.0.0:8080/someGet/aaaa/gg/cc,页面输出Helloaaaa-/gg/cc
但是浏览器输入http://0.0.0.0:8080/someGet/aaaa,报异常404 page not found

构造参数

我们除了可以获取路径参数,还可以获取构造的参数,我们看下面的例子


func main() {
	router := gin.Default()

	router.GET("/someGet", getting)
	router.Run()
}

func getting(c *gin.Context){
	firstname := c.DefaultQuery("firstname", "Guest")
	lastname := c.Query("lastname") // shortcut for c.Request.URL.Query().Get("lastname")

	c.String(http.StatusOK, "Hello %s %s", firstname, lastname)
}

浏览器输入http://0.0.0.0:8080/someGet?firstname=wyf&lastname=123
渲染页面输出为Hello wyf 123

浏览器输入http://0.0.0.0:8080/someGet?lastname=123,渲染页面输出为Hello Guest 123

post传参

这里为利用了postman进行演示操作

func main() {
	router := gin.Default()

	router.POST("/someGet", getting)
	router.Run()
}


func getting(c *gin.Context){
	message := c.PostForm("message")
	nick := c.DefaultPostForm("nick", "anonymous")

	c.JSON(200, gin.H{
		"status":  "posted",
		"message": message,
		"nick":    nick,
	})
}

效果图如下:
golangWeb框架---github.com/gin-gonic/gin学习一(路由、多级路由、参数传递几种形式)_第1张图片

get+post混合形式


func main() {
	router := gin.Default()

	router.POST("/someGet", getting)
	router.Run()
}


func getting(c *gin.Context){

	id := c.Query("id")
	page := c.DefaultQuery("page", "0")
	name := c.PostForm("name")
	message := c.PostForm("message")

	c.String(http.StatusOK,"id: %s; page: %s; name: %s; message: %s", id, page, name, message)
}

效果图如下:
golangWeb框架---github.com/gin-gonic/gin学习一(路由、多级路由、参数传递几种形式)_第2张图片

构造Map格式

这样的格式以前我还没见过,感觉挺新鲜的,看下代码



func main() {
	router := gin.Default()

	router.POST("/someGet", getting)
	router.Run()
}


func getting(c *gin.Context){
	ids := c.QueryMap("ids")
	names := c.PostFormMap("names")

	fmt.Printf("ids: %v; names: %v", ids, names)
	c.JSON(200,gin.H{
		"ids":ids,
		"names":names,
	})
	c.String(http.StatusOK,"ids: %v; names: %v",  ids, names)
}

fmt输出如下:

ids: map[b:hello a:1234]; names: map[first:thinkerou second:tianou]

效果图如下:
golangWeb框架---github.com/gin-gonic/gin学习一(路由、多级路由、参数传递几种形式)_第3张图片

分组路由

我们还可以进行路由分组设置,看下面的例子

package main

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



func main() {
	router := gin.Default()

	v1 := router.Group("/v1")
	{
		v1.GET("/read", readEndpoint)
	}

	v2 := router.Group("/v2")
	{
		v2.GET("/login", loginEndpoint)
	}

	router.Run(":8080")
}

func readEndpoint(c *gin.Context)  {
	fmt.Println("read")


}

func loginEndpoint(c *gin.Context)  {
	fmt.Println("login")
}

浏览器输入http://127.0.0.1:8080/v1/read
后台log输出read

浏览器输入http://127.0.0.1:8080/v2/login
后台log输出login

你可能感兴趣的:(Go基础,gin/pg(golang))