GO-GIN学习
五、gin获取form参数
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.LoadHTMLFiles("./web12/login.html")
r.GET("/login",func(c *gin.Context){
c.HTML(http.StatusOK,"login.html",nil)
})
r.Run(":9090")
}
<body>
<form action="/login" method="post">
<label for="username">username:</label>
<input type="text" name="username" id="username">
<label for="password">password:</label>
<input type="password" name="password" id="password">
<input type="button" value="登录">
</form>
</body>
</html>
显示结果见图片6。
如果想要换行显示:(外面套层div就行
<form action="/login" method="post" novalidate autocomplete="off">
<div>
<label for="username">username:</label>
<input type="text" name="username" id="username">
</div>
<div>
<label for="password">password:</label>
<input type="password" name="password" id="password">
</div>
<div>
<input type="button" value="登录">
</div>
</form>
form表单通常用post方法发送请求。
如果把type=“button”改成submit,那么action,你提交就会跳转到/login路由。
但是改成submit,由于我们后端还没有编写访问login的post请求,只有前面进入页面的get请求,所以我们如果写了登录和密码会跳转到404页面。
一次请求对应一个响应!!
这里没有改两个url,一直在login里,注意区分不同请求!!!
id属性一般是前端操作这些标签用的标记,form表单提交的键值对的键是name属性。
r := gin.Default()
r.LoadHTMLFiles("./web12/login.html","./web12/index.html")
r.GET("/login", func(c *gin.Context) {
c.HTML(http.StatusOK, "login.html", nil)
})
// 处理这个访问login请求,上面只是进入到页面的get请求
r.POST("/login", func(c *gin.Context) {
username := c.PostForm("username")
password := c.PostForm("password")
c.HTML(http.StatusOK, "index.html", gin.H{
"Name": username,
"Password": password,
})
})
<h1>Helloooooo, {{.Name}} !</h1>
<p>你的密码是: {{.Password}}</p>
<form action="/login" method="post" novalidate autocomplete="off">
<div>
<label for="username">username:</label>
<input type="text" name="username" id="username">
</div>
<div>
<label for="password">password:</label>
<input type="password" name="password" id="password">
</div>
<div>
<input type="submit" value="登录">
</div>
</form>
首先,以get方式我们进入到login页面,进行输入。
然后,在我们输入用户名和密码点击登录,submit以后,我们就通过表单的action而且是POST方式进入到login新页面,是新的内容不再是登陆界面,这是这次响应对应的请求。
再者,根据标签输入的信息,传输到后端,再传输到页面上,显示可见图片7。
// 注释
Ctrl+K+C
取消//注释
Ctrl+K+U
/* */ 多行注释
Alt + Shift +A
取消多行注释同上
加入第三种接收方法 会有返回值ok
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.LoadHTMLFiles("./web12/login.html","./web12/index.html")
r.GET("/login", func(c *gin.Context) {
c.HTML(http.StatusOK, "login.html", nil)
})
// 处理这个访问login请求,上面只是进入到页面的get请求
r.POST("/login", func(c *gin.Context) {
//获取form表达的提交的数据
/*方法一
username := c.PostForm("username")
password := c.PostForm("password")*/
/*方法二
username :=c.DefaultPostForm("username","somebody")
password :=c.DefaultPostForm("password","***") */
//方法三
username ,ok:= c.GetPostForm("username")
if !ok{
username = "preciouswxe"
}
password ,ok:=c.GetPostForm("password") //ok被重新创建
if !ok{
password = "i don't know"
}
c.HTML(http.StatusOK, "index.html", gin.H{
"Name": username,
"Password": password,
})
})
r.Run(":9090")
}
六、gin获取URL路径参数
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
//获取请求的path(URI)参数
func main() {
r := gin.Default()
r.GET("/:name/:age", func(c *gin.Context) {
//获取路径参数
name := c.Param("name")
age := c.Param("age")
c.JSON(http.StatusOK,gin.H{
"name":name,
"age":age,
})
})
r.Run(":9090")
}
主打一个读取输入的url对应的值,并在页面上展示,见如下(返回json格式的内容)或者图片8。也可以试试修改 变成各类字符串
{
"age": "18",
"name": "leeson"
}
接下来再添加路由,在旧版本golang里,会因为上面的路由指定导致下面冲突报错,保险起见要像下面这么写。
func main() {
r := gin.Default()
r.GET("/user/:name/:age", func(c *gin.Context) {
//获取路径参数
name := c.Param("name")
age := c.Param("age")
c.JSON(http.StatusOK, gin.H{
"name": name,
"age": age,
})
})
r.GET("/blog/:year/:month", func(c *gin.Context) {
year := c.Param("year")
month := c.Param("month")
c.JSON(http.StatusOK, gin.H{
"year": year,
"month": month,
})
})
r.Run(":9090")
}
这样输入url为http://127.0.0.1:9090/blog/2024/2 可以得到json显示如下或者看图片9
{
"month": "2",
"year": "2024"
}