青训营笔记4 | 豆包MarsCode AI刷题

51 阅读3分钟

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"
}