Golang Gin基本使用

路由与传参

1. 无参路由

 比如系统是单集群,那么这种就不需要传参了。

package main

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

//handler处理

func HelloHandler(c *gin.Context) {
	//gin.Context上下文封装了request和response,可以拿到请求的参数和头部。一个c可以干response的事情,也可以干request的事情
	paramName := c.Query("name")
	fmt.Println(paramName)

	c.String(http.StatusOK, "hello world")

	//返回字符串数据,其实也就是一个map
	c.JSON(http.StatusOK, gin.H{
		"data": "123",
		"msg":  "请求成功",
	})
}

func main() {
	//初始化gin以及run
	g := gin.Default()
	//这里匿名函数也可以,写实际的函数也可以,项目里面写具体的函数,逻辑更加的清晰
	g.GET("/hello", HelloHandler)
	g.Run(":8000")

}

2. API参数

可以通过 Context Param 方法来获取 API 参数
package main

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

func GetBookDetailHandler(c *gin.Context) {
	bookId := c.Param("id")
	c.String(http.StatusOK, "书籍id:"+bookId)
}

func main() {
	g := gin.Default()
	g.GET("/book/:id", GetBookDetailHandler)
	g.Run(":8000")
}

这种也不是常用的,常用的其实是传递参数的方式。

3. url参数

URL 参数可以通过 DefaultQuery() Query() 方法获取
DefaultQuery() 若参数不存在,返回默认值, Query() 若不存在,返回空串 http://127.0.0.1:8000/user?name=zhangsan
package main

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

func GetUserDetailHandler(c *gin.Context) {
	userName := c.Query("name")
	c.String(http.StatusOK, fmt.Sprintln("username:", userName))
}

func main() {
	g := gin.Default()
	g.GET("/info", GetUserDetailHandler)
	g.Run(":8000")
}

4. ShouldBind参数绑定

我们可以基于请求的 Content-Type 识别请求数据类型并利用反射机制
自动提取请求中 QueryString form 表单 、 JSON XML 等参数到结构体中
下面的示例代码演示了 .ShouldBind() 强大的功能
它能够基于请求自动提取 JSON form 表单 和 QueryString 类型的数据,并把值绑定到指定的结构 体对象。(无论是form还是json的都一样去处理)

其实也就是将json反序列化为一个结构体了

type Login struct {
	UserName string `json:"username"`
	Passwd   string `json:"passwd"`
}

func LoginHandler(c *gin.Context) {
	var login Login
	if err := c.ShouldBind(&login); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{
			"msg": "请求参数异常" + err.Error(),
		})
		return
	}
	c.JSON(http.StatusOK, gin.H{
		"msg":  "参数获取成功",
		"data": fmt.Sprintln("姓名:", login.UserName, "密码:", login.Passwd),
	})
}

func main() {
	r := gin.Default()
	r.POST("/login", LoginHandler)
	r.Run(":8000")
}

如果是get的话那么就是form的格式

扫描二维码关注公众号,回复: 14604724 查看本文章

响应返回

响应 String和json
// 字符串响应
func ResponseStringHandler(c *gin.Context) {
	c.String(http.StatusOK, "返回简单的字符串")
}

// json响应
func ResponseJsonHandler(c *gin.Context) {
	//msg和data不是写死的,而是一种很好的返回格式规范
	c.JSON(http.StatusOK, gin.H{
		"msg":  "请求成功",
		"data": 123,
	})
}

func main() {
	g := gin.Default()
	g.GET("/api/string", ResponseStringHandler)
	g.POST("/api/json", ResponseJsonHandler)
	g.Run()
}

下面也是用来处理响应的,先声明一个结构体,然后再将值放进去,然后再返回数据,其实直接gin.H就行了。

func ResponseJsonHandler(c *gin.Context) { 
    type Data struct { 
        Msg string `json:"msg"` 
        Code int `json:"code"` }
    
    d := Data{ 
        Msg: "Json数据", 
        Code: 1001, 
    }

    c.JSON(http.StatusOK, d) 
     也可以直接使用 gin.H返回 json数据 
    //c.JSON(http.StatusOK, gin.H{ 
    // "msg": "success", 
    //}) }

路由分发


为什么需要路由分发?

我们一个项目有非常多的模块,如果全部写在一块导致代码结构混乱,不利于后续的扩展
按照大的模块,每个模块有自己独立的路由,主路由可以再 main.go 中进行注册
1. 项目结构
.
├── go.mod 
├── go.sum 
├── main.go 
└── routers 
   ├── books.go 
   └── users.go

猜你喜欢

转载自blog.csdn.net/qq_34556414/article/details/129704418