gin 路由,参数,输出

5 篇文章 0 订阅

安装

go get -u github.com/gin-gonic/gin
官方例子
package main

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

func main() {
	r := gin.Default()
	r.GET("/ping", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{
			"message": "pong",
		})
	})
	r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}

路由

gin.Default() 和 gin.New() 区别
// gin.Default
func Default() *Engine {
	debugPrintWARNINGDefault()
	engine := New()
	engine.Use(Logger(), Recovery())
	return engine
}

通过上面代码可得知,gin.Default() 创建的路由器会使用日志和错误发现中间件

路由分组
package main

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

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

	// 通过 Group(relativePath) 进行分组
	// relativePath:前缀
	group := r.Group("/api")
	
	//访问 /api/ping
	group.GET("/ping", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{
			"message": "pong",
		})
	})
	r.Run()
}
路由参数
动态路由参数

通过 “:” + 参数名 或通过 星号 + 参数名 设置动态参数
星号 + 参数名 会将 其”/“后的所有path都赋值到该参数中

package main

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

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

	//通过 ":" + 参数名 设置动态参数
	r.GET("/ping/:controller/:action", func(c *gin.Context) {

		//从gin.Context 中通过 param(参数名) 获取动态参数值
		c.JSON(http.StatusOK, gin.H{
			"message":    "pong",
			"controller": c.Param("controller"),
			"action":     c.Param("action"),
		})
	})

	//通过 "*" + 参数名设置动态参数
	r.GET("/look/:controller/*action", func(c *gin.Context) {
		//从gin.Context 中通过 param(参数名) 获取动态参数值
		//访问 localhost:8080/look/good/list/a/b/c
		c.JSON(http.StatusOK, gin.H{
			"message":    "pong",
			"controller": c.Param("controller"),
			// action: /list/a/b/c
			"action":     c.Param("action"),
		})
	})

	r.Run(":8080")
}
动态参数验证

gin.Context 提供 ShouldBindUri(obj) 对参数进行验证,参数验证失败返回error,obj 提供验证规则,验证通过后,动态参数可以通过obj中的属性获取
obj中的属性名自定义即可,类型即对应动态参数类型 通过 “参数描述” 通过参数描述对其做其它限制,如:

//Id是obj属性名
//int是Id类型也对应限制动态参数类型

//string后的`.....`中为参数描述
//uri:"id" 代表其对应url中的:id或*id,和obj属性的对应关系
//binding:后的为绑定规则,required:要求必填写

type Ping struct {
	Id int `uri:"id" binding:"required"`
}
package main

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

type Ping struct {
	Controller string `uri:"controller" binding:"required"`
	Action     string    `uri:"action" binding:"required"`
	Id       int `uri:"id" binding:"required"`
}

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

	r.GET("/ping/:controller/:action/:id", func(c *gin.Context) {
		p := &Ping{}
		err := c.ShouldBindUri(p)
		if err != nil {
			//不符合路由规则,给其返回找不到的错误码404
			c.Status(404)
			return
		}

		c.JSON(http.StatusOK, gin.H{
			"message":    "pong",
			"controller": c.Param("controller"),
			"action":     c.Param("action"),
			"id":       c.Param("id"),
		})
	})

	r.Run(":8080")

参数

一般分为三种参数:
1.路由参数,组成路由的一部分
2.GET请求的参数
3.POST请求的参数

获取GET参数

gin.Context 提供了DefaultQuery(key,value) 和 Query(key) 获取GET参数,DefaultQuery 比 Query 多一个设置默认值功能

package main

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

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

	r.GET("/ping", func(c *gin.Context) {
		controller := c.DefaultQuery("controller", "default_controller")
		action := c.DefaultQuery("action", "default_action")
		c.JSON(http.StatusOK, gin.H{
			"message":    "pong",
			"controller": controller,
			"action":     action,
		})
	})

	r.Run(":8080")
}
获取POST参数

gin.Context 提供了 DefaultPostForm(key,value) 和 PostForm(key) 获取POST参数,DefaultPostForm 比 PostForm 多一个设置默认值功能

package main

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

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

	r.POST("/ping", func(c *gin.Context) {
		controller := c.DefaultPostForm("controller", "default_controller")

		action := c.DefaultPostForm("action", "default_action")
		c.JSON(http.StatusOK, gin.H{
			"message":    "pong",
			"controller": controller,
			"action":     action,
		})
	})

	r.Run(":8080")
}

输出

输出JSON

通过 gin.Context 提供的 JSON(code,obj) 输出JSON格式
obj支持两种类型:

  1. gin.H 即 map[string]any
package main

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

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

	r.GET("/ping", func(c *gin.Context) {
		c.JSON(http.StatusOK,gin.H{
			"message":"输出普通JSON",
		})
	})

	r.Run(":8080")
}

  1. struct
package main

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


type Data struct {
	Message string
	Code    int `json:"status_code"`
}

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

	r.GET("/ping", func(c *gin.Context) {
		//{"Message":"结构体转换","status_code":200}
		//输出status_code是因为设置JSON tag `json:"status_code"`
		// Code 转换为 status_code
		c.JSON(http.StatusOK,Data{
			Message: "结构体转换",
			Code:    200,
		})
	})

	r.Run(":8080")
}
输出ProtoBuf

gin.Context 提供 ProtoBuf(code int, obj any) 输出 ProtoBuf

编写proto文件

//trip.proto
syntax = "proto3";
package xie;
option go_package = ".;trippb";

message CreateTripRequest{
  string  message = 1;
  int64 status_code = 2;
}

通过proto生成结构体 trip.pb.go
需要下载proto工具(https://github.com/protocolbuffers/protobuf/releases)

protoc -I=. --go_out=paths=source_relative:./ trip.proto

输出ProtoBuf

package main

import (
	trippb "ServiceProxy/public/proto"
	"github.com/gin-gonic/gin"
	"net/http"
)

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

	r.GET("/ping", func(c *gin.Context) {
	     c.ProtoBuf(http.StatusOK,&trippb.CreateTripRequest{
			  Message:    "666",
			  StatusCode: 200,
		  })
	})

	r.Run(":8080")
}

访问浏览器会下载得到ping文件(移动ping 到 /Users/xieruixiang/go/src/ServiceProxy/public/ping)
通过 proto.Unmarshal 还原ping文件内容到protobuf结构体

package main

import (
	trippb "ServiceProxy/public/proto"
	"fmt"
	"google.golang.org/protobuf/proto"
	"os"
)

func main() {

	file, err := os.ReadFile("/Users/xieruixiang/go/src/ServiceProxy/public/ping")
	if err != nil {
		panic(err)
	}
	m := &trippb.CreateTripRequest{}
	proto.Unmarshal(file, m)
    //666,200
	fmt.Println(m.Message,m.StatusCode)
}
输出PureJSON

与JSON相比,PureJSON会将特殊的HTML字符进行unicode编码,可以直接进行html的原样输出

package main

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

func main() {
	r := gin.Default()
	r.GET("/ping", func(c *gin.Context) {
		c.PureJSON(http.StatusOK, gin.H{
			"html": `
<div><button style="color:red;">submit</button></div>
`,
		})
	})
	r.Run(":8080")
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值