相关代码位置:https://github.com/imyzt/learning-technology-code/tree/master/golang/imooc-gin-study
httpMethod start
package main
import "github.com/gin-gonic/gin"
func main() {
// 简单gin使用
r := gin.Default()
r.GET("/get", func(context *gin.Context) {
context.JSON(200, gin.H{
"message": "get",
})
})
r.POST("/post", func(context *gin.Context) {
context.JSON(200, gin.H{
"message": "post",
})
})
r.DELETE("/delete", func(context *gin.Context) {
context.JSON(200, gin.H{
"message": "delete",
})
})
r.PUT("/put", func(context *gin.Context) {
context.JSON(200, gin.H{
"message": "put",
})
})
// 支持任意请求
r.Any("/any", func(context *gin.Context) {
context.String(200, "any")
})
r.Run()
}
rest参数
r.GET(":name/:id", func(context *gin.Context) {
context.JSON(200, gin.H{
"name": context.Param("name"),
"id": context.Param("id"),
})
})
开放静态资源
// 静态文件夹
r.Static("/asserts", "./asserts")
// 静态文件目录
r.StaticFS("/static", http.Dir("/Users/imyzt/Downloads/"))
// 静态文件
r.StaticFile("/test.html", "./test.html")
泛匹配
r.GET("/name/*action", func(context *gin.Context) {
context.String(200, "helloWorld")
})
获取GET请求参数
r.GET("/test", func(context *gin.Context) {
firstName := context.Query("firstName")
// 默认值
lastName := context.DefaultQuery("lastName", "defaultLastName")
context.JSON(http.StatusOK, gin.H{
"firstName": firstName,
"lastName": lastName,
})
})
获取POST form-data请求参数
r.POST("/test", func(context *gin.Context) {
firstName := context.PostForm("firstName")
// 默认值
lastName := context.DefaultPostForm("lastName", "defaultLastName")
context.JSON(http.StatusOK, gin.H{
"firstName": firstName,
"lastName": lastName,
})
})
获取POST body请求参数
r.POST("/test", func(context *gin.Context) {
bodyBytes, err := ioutil.ReadAll(context.Request.Body)
if err != nil {
context.String(http.StatusBadRequest, err.Error())
context.Abort()
}
// 回传, 方便获取参数
context.Request.Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes))
// 默认值
name := context.DefaultPostForm("name", "defaultName")
context.String(http.StatusOK, "%s - %s", name, string(bodyBytes))
})
CURL输出
//curl -X POST "localhost:8080/test" -d 'name=xxx&bbb=ddd'
//xxx - name=xxx&bbb=ddd%
GET/POST请求参数映射到struct
type Student struct {
Name string `form:"name" json:"name"`
Addr string `form:"addr" json:"addr"`
Birthday time.Time `form:"birthday" time_format:"2006-01-02 15:04:05" json:"birthday"`
}
func main() {
r := gin.Default()
r.POST("test", test)
r.GET("test", test)
r.Run()
}
func test(context *gin.Context) {
var student Student
// 根据不同的context-type,做不同的映射
if err := context.ShouldBind(&student); err != nil {
context.String(http.StatusBadRequest, "student bind error %v", err.Error())
return
}
context.JSON(http.StatusOK, student)
}