package main import ( "github.com/gin-gonic/gin" "net/http" ) func funcPost(c *gin.Context) { c.String(http.StatusOK, "post请求") } func main() { r := gin.Default() r.GET("/", func(c *gin.Context) { c.String(http.StatusOK, "hello word") }) r.POST("/",funcPost) //r.DELETE() //r.PUT() //r.OPTIONS() //监听端口默认为8080 r.Run(":8000") }
*
号类型的参数,表示匹配所有package main import ( "fmt" "github.com/gin-gonic/gin" "net/http" "strings" ) func main() { r := gin.Default() r.GET("/user/:name/*action", func(c *gin.Context) { name := c.Param("name") action := c.Param("action") fmt.Println(action) //把字符串开头/截取掉 action = strings.Trim(action, "/") fmt.Println(action) c.String(http.StatusOK, name+" is "+action) }) //默认为监听8080端口 r.Run(":8000") }
package main import ( "fmt" "net/http" "github.com/gin-gonic/gin" ) func main() { r := gin.Default() r.GET("/user", func(c *gin.Context) { //指定默认值 //http://localhost:8080/user 才会打印出来默认的值 //name := c.DefaultQuery("name", "世界") name := c.Query("name") c.String(http.StatusOK, fmt.Sprintf("hello %s", name)) }) r.Run() }
不传递参数输出的结果:
传递参数输出的结果:
package main import ( "fmt" "net/http" "github.com/gin-gonic/gin" ) func main() { r := gin.Default() r.POST("/form", func(c *gin.Context) { username := c.PostForm("username") password := c.PostForm("password") // 获取body体中数据--》json格式 body,_ := ioutil.ReadAll(c.Request.Body) fmt.Println("---body--"+string(body)) c.String(http.StatusOK, fmt.Sprintf("用户名:%s,密码:%s", username, password)) }) r.Run() }
客户端传参,后端接收并解析到结构体定
package main import ( "github.com/gin-gonic/gin" "net/http" ) // 定义接收数据的结构体 type Login struct { // binding:"required"修饰的字段,若接收为空值,则报错,是必须字段 User string `json:"username" binding:"required"` Password string `json:"password" binding:"required"` } func main() { // 1.创建路由 r := gin.Default() // JSON绑定 r.POST("/loginJSON", func(c *gin.Context) { // 声明接收的变量 var login Login // 将request的body中的数据,自动按照json格式解析到结构体(只能解析json格式) if err := c.ShouldBindJSON(&login); err != nil { // 返回错误信息 c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } // 判断用户名密码是否正确 if login.User == "lqz" && login.Password == "123" { c.JSON(http.StatusBadRequest, gin.H{"status": "100", "msg": "登陆成功"}) }else { c.JSON(http.StatusOK, gin.H{"status": "101","msg": "用户名或密码错误"}) } }) r.Run(":8000") }
使用postman测试,编码使用json格式,向http://127.0.0.1:8000/loginJSON发送post请求
{"username":"lqz","password":"123"}
package main import ( "github.com/gin-gonic/gin" "net/http" ) // 定义接收数据的结构体 type Login struct { // binding:"required"修饰的字段,若接收为空值,则报错,是必须字段 User string `form:"username" binding:"required"` Password string `form:"password" binding:"required"` } func main() { // 1.创建路由 r := gin.Default() // JSON绑定 r.POST("/loginForm", func(c *gin.Context) { // 声明接收的变量 var login Login //Bind()默认解析并绑定form格式,根据请求头中content-type自动推断 //urlencoded,json,form-data格式都支持 if err := c.Bind(&login); err != nil { // 返回错误信息 c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } // 判断用户名密码是否正确 if login.User == "lqz" && login.Password == "123" { c.JSON(http.StatusBadRequest, gin.H{"status": "100", "msg": "登陆成功"}) }else { c.JSON(http.StatusOK, gin.H{"status": "101","msg": "用户名或密码错误"}) } }) r.Run(":8000") }
使用postman测试,编码使用urlencoded或form-data格式,向http://127.0.0.1:8000/loginForm发送post请求
package main import ( "fmt" "github.com/gin-gonic/gin" "net/http" ) // 定义接收数据的结构体 type Login struct { User string `uri:"username" binding:"required"` Password string `uri:"password" binding:"required"` } func main() { r := gin.Default() r.GET("login/:username/:password", func(c *gin.Context) { var login Login // 解析并绑定路径中的参数 if err := c.ShouldBindUri(&login); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } // 判断用户名密码是否正确 fmt.Println(login.Password,login.User) if login.User != "lqz" || login.Password != "123" { c.JSON(http.StatusBadRequest, gin.H{"status": "304", "msg": "用户名或密码错误"}) return } c.JSON(http.StatusOK, gin.H{"status": "200"}) }) r.Run(":8000") }
使用postman测试,编码使用urlencoded或form-data格式,向http://127.0.0.1:8000/login/lqz/123发送get请求
ShouldBind
会按照下面的顺序解析请求中的数据完成绑定:
GET
请求,http://127.0.0.1:8000/loginForm/?username=lqz&password=123POST
请求,三种编码格式都支持package main import ( "github.com/gin-gonic/gin" "net/http" ) // 定义接收数据的结构体 type Login struct { // binding:"required"修饰的字段,若接收为空值,则报错,是必须字段 User string `form:"username" json:"username" uri:"username" binding:"required"` Password string `form:"password" json:"password" uri:"password" binding:"required"` } func main() { router := gin.Default() // 绑定JSON的示例 ({"username": "lqz", "password": "123"}) router.POST("/loginJSON", func(c *gin.Context) { var login Login if err := c.ShouldBind(&login); err == nil { c.JSON(http.StatusOK, gin.H{ "user": login.User, "password": login.Password, }) } else { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) } }) // 绑定QueryString示例 (http://127.0.0.1:8000/loginForm/?username=lqz&password=123) router.GET("/loginForm", func(c *gin.Context) { var login Login // ShouldBind()会根据请求的Content-Type自行选择绑定器 if err := c.ShouldBind(&login); err == nil { c.JSON(http.StatusOK, gin.H{ "user": login.User, "password": login.Password, }) } else { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) } }) router.Run(":8000") }
<?xml version="1.0" encoding="UTF-8"?> <login> <username type="string">刘清政</username> <password type="string">123</password> </login>
package main import ( "encoding/xml" "fmt" "github.com/gin-gonic/gin" ) // 定义接收数据的结构体 type Login struct { // binding:"required"修饰的字段,若接收为空值,则报错,是必须字段 User string `xml:"username" binding:"required"` Password string `xml:"password" binding:"required"` } func main() { router := gin.Default() router.POST("/loginXml", func(c *gin.Context) { var login Login body,_:=c.GetRawData() // 本质就是从body中读出所有数据:ioutil.ReadAll(c.Request.Body) err:=xml.Unmarshal(body,&login) if err != nil { fmt.Println(err) c.String(200,"解析xml失败") return } fmt.Println(login) c.String(200,"解析xml成功") }) router.Run(":8000") }
使用postman向http://127.0.0.1:8000/loginXml发送post请求,携带上面xml数据
使用
r := gin.New()
代替
// Default 使用 Logger 和 Recovery 中间件 r := gin.Default()