gin学习笔记一:请求相关

120 阅读2分钟

1. 引入gin

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

2. gin.Default方法生成一个路由引擎

r := gin.Default()

r上面有很多方法如GET,POST,DELETE,PATCH等对应不同的请求,此外还有LoadHTMLGlobLoadHTMLFiles方法用于加载html文件,最后用Run(":port")方法运行并指定端口号

3. 以GET方法为例

GET第一个参数是访问路径path,第二个参数则是一个回调函数func(context *gin.Context) {}

后者这个context上下文对象有很多方法,如HTML,JSON,String,可以帮助我们返回不同格式的响应,还有如context.Query方法可以帮我们获取get方法的参数,例如:

r.GET("/stu/get", func(c *gin.Context) {  
    res := c.Query("message")  
    res2 := c.Query("name")  
    c.JSON(200, gin.H{  
    "message": res,  
    "name": res2,  
    })  
})

4. 上面提到的JSON方法

传入两个参数:状态码和响应体,状态码如200可以用http.StatusOK替换,而响应体可以是struct也可以是mapgin提供的gin.H就是map[string]any类型

func _json(c *gin.Context) {
    type UserInfo struct{
        UserName string
        Age int `json:"age"` //json转换为"age"
        class string //小写json转换忽略
        Class string `json:"-"`//可以达到同样效果
    }
    c.JSON(200,user)
}
r.GET("/stu/json",_json)

由下面代码可知JSON方法可以接受任意类型的obj,它其实是帮我们将传入的obj做JSON转换,并设置Content-Type:"application/json"

// JSON serializes the given struct as JSON into the response body.  
// It also sets the Content-Type as "application/json".  
func (c *Context) JSON(code int, obj any) {  
c.Render(code, render.JSON{Data: obj})  
}

5. 响应html

r.GET("/stu", func(c *gin.Context) {  
    r.LoadHTMLGlob("template/**/*")//加载指定目录的全局html
    c.HTML(200, "user/index.html", gin.H{  
    "title": "test",  
    })  
})

6. 文件响应

StaticFSStaticFile方法可以用于开放指定静态目录让外界访问,注意第一个参数是路由path,不要与其他路由冲突

r.StaticFS("/stu/static", http.Dir("template/post"))

7. 重定向

func _redirect(c *gin.Context) {  
    c.Redirect(http.StatusMovedPermanently, "https://www.baidu.com")  
}
r.GET("/stu/txt", _redirect)

8. 动态参数(param)

r.GET("/stu/:id", param_func),如果输入的是/stu/2021,那么id获取的就是2021;

param_func中,通过context.Param("id")获取动态参数的值

还可以r.GET("/stu/:user_id/:book_id", param_func)

9. 表单参数(multipart/form-data、application/x-www-from-unlencoded)

PostFormPostFormDefaultPostFormMultipartForm方法获取参数值 其中MultipartForm可以获取所有参数包括上传的文件

10. 原始参数

使用的是GetRawData方法,返回的是byte[]

data,_:= c.GetRawData()  
fmt.Println(string(data))
  • form-data Content-Disposition: form-data; name="name" 张三 ···
  • x-www-from-unlencoded name=abc&age=18
  • json {"name":"abc","age":18}