1. 引入gin
import "github.com/gin-gonic/gin"
2. gin.Default方法生成一个路由引擎
r := gin.Default()
r上面有很多方法如GET,POST,DELETE,PATCH等对应不同的请求,此外还有LoadHTMLGlob、LoadHTMLFiles方法用于加载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也可以是map,gin提供的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. 文件响应
StaticFS和StaticFile方法可以用于开放指定静态目录让外界访问,注意第一个参数是路由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)
有PostForm、PostForm、DefaultPostForm、MultipartForm方法获取参数值
其中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}