Gin 框架的使用

1、Gin 快速开发

1.1、环境准备

1.1.1、导入 gin 依赖

这里就叫 gin 依赖了,在 Goland 命令行中输入下面的命令:

go get -u github.com/gin-gonic/gin

1.1.2、设置代理

如果下载失败,最好设置一下代理,在 cmd 命令行中输入下面的命令: 

go env -w GOPROXY=https://goproxy.cn,direct

完了之后再 Goland 这里同样设置启用 environment:

1.2、快速开发

1.2.1、Hello world

package mainimport "github.com/gin-gonic/gin"func main() {// 创建一个服务ginServer := gin.Default()// todo Go语言中的处理请求方法都是函数式编程:第一个参数是请求地址 第二个请求是函数// 访问地址,处理请求ginServer.GET("/hello", func(context *gin.Context) {context.JSON(200,gin.H{"msg":"hello world"})})// 设置服务器端口ginServer.Run(":8082") // 默认 8080
}

        上面,我们首先得到了 ginServer ,然后直接通过函数式编程,给 GET 请求 "/hello" 设置处理函数:直接返回给前端一段 JSON 数据。

        这个返回格式和我们之前学习的 SpringBoot 是不谋而合的,它们都会返回一个状态码和一段任意类型的信息(在 SpringBoot 中是 Object,在这里是 any 类型)。

启动程序,访问 localhost:8082:

1.2.2、给网页设置 icon  

直接在 Goland 命令行输入:go get "github.com/thinkerou/favicon":

 直接在上面的代码基础上添加下面的代码:

import("github.com/thinkerou/favicon"
)

 在 main 方法中添加一行代码即可:

    // 设置网页iconginServer.Use(favicon.New("./sxau.ico"))

测试: 

// todo 新增用户ginServer.POST("/user", func(ctx *gin.Context) {ctx.JSON(200,gin.H{"msg":"新增用户",})})

1.2.3、给前端响应界面

1、加载 HTML 文件

        有两种方法,一种是加载 html 所在目录下所有文件,一种是加载单个 html 文件:

    // 加载静态页面ginServer.LoadHTMLGlob("static/html/*")//ginServer.LoadHTMLFiles("static/index.html") // 加载指定的 HTML 文件

2、加载 css、js 
    // 加载资源文件 css、jsginServer.Static("/static","./static")

        此外,我们可以看到每次运行,Go 都会把我们的程序打包为一个 exe(windows),在 linux 和 mac 上同样会直接打包为一个可执行文件,所以特别方便!

1.2.4、获取请求中的参数

1)& ?格式
// 1. /user?user_id=xxx&username=xxx 格式ginServer.GET("/user", func(ctx *gin.Context) {user_id := ctx.Query("user_id")username := ctx.Query("username")ctx.JSON(http.StatusOK,gin.H{"user_id": user_id,"username": username,})})

2)RESTful 风格

SpringBoot 中我们使用 /user/{user_id} 的格式来传递参数,go 语言中我们使用 :user_id 来传递

// 2. /user/user_id/usernameginServer.GET("/user/:user_id/:username", func(ctx *gin.Context) {user_id := ctx.Param("user_id")username := ctx.Param("username")ctx.JSON(http.StatusOK,gin.H{"user_id": user_id,"username": username,})})

1.2.5、序列化数据

把前端发来的数据(已经不是 json 了)转为 json 再返回:

	// todo 前端给后端传递 jsonginServer.POST("/json", func(ctx *gin.Context) {// 从请求体(request.body)获得对象// GetRawData() 返回请求体切片[]byte和错误信息errdata,err := ctx.GetRawData()fmt.Println("date => "+string(data))fmt.Println("err => ",err)var m map[string]interface{}// 序列化包装为json数据_ = json.Unmarshal(data,&m)ctx.JSON(http.StatusOK,m)})

1.2.6、获取表单数据

    // todo 新增用户ginServer.POST("/user", func(ctx *gin.Context) {// 对应表单的input标签的name属性username := ctx.PostForm("username")password := ctx.PostForm("password")ctx.JSON(200,gin.H{"msg":"新增用户","username":username,"password":password,})})

1.2.5、路由之重定向到首页

重定向的状态码是 301 ! 

    // todo 路由ginServer.GET("/test", func(ctx *gin.Context) {// 重定向 301ctx.Redirect(http.StatusMovedPermanently,"/index")})

1.2.6、路由之404页面

    // 404ginServer.NoRoute(func(ctx *gin.Context) {// 它会自动拼接 static/html/ctx.HTML(http.StatusNotFound,"404.html",nil)})

1.2.7、路由之路由组

路由组就相当于我们 SpringBoot 中控制器类上面 @RequestMapping 的统一前缀: 

    // 路由组(RESTful 风格)book := ginServer.Group("/book"){// 相当于访问 /book/idbook.GET("/:id", func(ctx *gin.Context) {})// 相当于访问 /book/idbook.DELETE("/:id", func(ctx *gin.Context) {})}

1.2.8、拦截器(中间件)

在我们的 JavaWeb 项目中叫做拦截器,在 Go 语言的 Web 项目中一般叫中间件。

1、自定义拦截器

        下面自定义一个拦截器,请求参数中必须包含 username ,如果用户名是 admin 则放行,否则阻止。此外,我们可以在拦截器中设置一些全局变量,如果一个请求设置了拦截器,那么就可以在这个请求的处理方法中获取拦截器中设置的参数。

// 自定义go中间件 (相当于Java中的拦截器)
func interceptor() gin.HandlerFunc {return func(ctx *gin.Context) {// 通过自定义的中间件设置的值,后续都可以通过中间件访问到这个值ctx.Set("usersession","user")username := ctx.Query("username")if username=="admin" {ctx.Next() // 放行}else {ctx.Abort() // 阻止}}
}
2、注册拦截器 

注意:如果注册之后没有在任何请求方法中使用拦截器,那么将作用于所有拦截器!如果指定了任意一个或多个拦截器,那么将只会作用于这些请求!

// 注册中间件 注册之后未使用的话默认全局使用 如果未注册或者给某个请求使用了这个中间件的话就只对这个请求生效ginServer.Use(interceptor())
3、使用拦截器 
// 这里设置了中间件 会先通过拦截器才能继续处理ginServer.GET("/index",interceptor(),func(ctx *gin.Context) {// 取出中间件爱中的值usersession := ctx.MustGet("usersession").(string)log.Println("=========> ",usersession)//ctx.JSON(200,gin.H{"msg":"返回 json 数据"})ctx.HTML(http.StatusOK,"index.html",gin.H{"msg":"这是go后端返回的数据",})})

测试放行:

测试阻止:

1.3、Web 登录验证 Demo

下面做一个简单的用户登录界面验证,结合 MySQL:

1.3.1、登录界面 HTML

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>登录页面</title><link rel="stylesheet" href="/static/css/style.css">
</head>
<body>
<div class="login-container"><h2>登录</h2><form method="post" action="/login"><label for="username">用户名:</label><input type="text" name="username" required><br><br><label for="password">密码:</label><input type="password" name="password" required><br><br><input type="submit" value="登录"></form>
</div>
</body>
</html>

1.3.2、CSS

body {font-family: Arial, sans-serif;background-color: #f4f4f4;
}.login-container {width: 300px;padding: 16px;background-color: white;border-radius: 5px;box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);
}h2 {text-align: center;
}input[type=text], input[type=password] {width: 100%;padding: 12px 20px;margin: 8px 0;display: inline-block;border: 1px solid #ccc;box-sizing: border-box;
}input[type=submit] {width: 100%;background-color: #4CAF50;color: white;padding: 14px 20px;margin: 8px 0;border: none;border-radius: 4px;cursor: pointer;
}input[type=submit]:hover {background-color: #45a049;
}

1.3.3、Go 数据库查询代码

需要导入 mysql 的包,连接:

package utilimport ("database/sql""fmt"_ "github.com/go-sql-driver/mysql"
)const USERNAME,PASSWORD string = "root","Yan1029."// todo 公开的方法必须首字母大写才能被其它go文件调用
func Connect(username, password string) *sql.DB {db,err := sql.Open("mysql","root:Yan1029.@tcp(127.0.0.1:3306)/go_web?charset=utf8mb4")if err != nil {println("连接失败",err)}db.Ping() // 尝试连接数据库return db
}
func Close(db *sql.DB)  {if db != nil {db.Close()}
}type User struct {id intusername stringpassword string
}
/**查询用户是否已经注册*/
func HasUser(db *sql.DB,username,password string) bool {var user UserquerySql := "SELECT * FROM register_users WHERE username=? AND password=?"row := db.QueryRow(querySql,username,password)err := row.Scan(&user.id,&user.username,&user.password)if err!=nil {fmt.Print("查询失败",err)return false}return true
}

1.3.4、Go 请求处理代码

package main// 导入 gin
import ("encoding/json""fmt""github.com/gin-gonic/gin""github.com/thinkerou/favicon""go1/util""net/http"
)func main() {// 创建一个服务ginServer := gin.Default()// 设置网页iconginServer.Use(favicon.New("./sxau.ico"))// 加载静态页面ginServer.LoadHTMLGlob("static/html/*")//ginServer.LoadHTMLFiles("static/index.html") // 加载指定的 HTML 文件// 加载资源文件ginServer.Static("/static","./static")ginServer.POST("/login", func(ctx *gin.Context) {// 获得登录参数username := ctx.PostForm("username")password := ctx.PostForm("password")db := util.Connect(util.USERNAME,util.PASSWORD)if util.HasUser(db,username,password) {fmt.Println("存在该用户")ctx.HTML(http.StatusOK,"home.html",nil)}else{fmt.Println("不存在该用户")ctx.HTML(http.StatusNotFound,"404.html",nil)}util.Close(db)})// 服务器端口ginServer.Run(":8082") // 默认 8080
}

测试:

输入正确的账号密码:

输入错误的账号密码:

总结

        Go 语言开发 Web 应用还是特别简单的,比起 Java 肉眼可见的高效!确实是爽歪歪,下去好好了再去一下 Go 语言的一些基础!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/7362.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

golang系统内置函数整理

go语言中有很多系统内置的函数&#xff0c; 为了方便学习&#xff0c;对系统内置函数的函数定义 入参和返回值做如下整理&#xff0c;以方便学习和记忆。 Go语言系统级别的内置函数不多&#xff0c;但是包含的知识点可不少&#xff0c;是学习go语言说必须要搞明白的基础知识 …

老旧房屋用电线路故障引起的电气火灾预防对策​

摘 要&#xff1a;在我国新农村建设方针指引下&#xff0c;农村地区的发展水平有了显著提高。在农村经济发展中&#xff0c;我们也要认识到其中存在的风险隐患问题&#xff0c;其中重要的就是火灾事故。火灾事故给农村发展带来的不利影响&#xff0c;不仅严重威胁到农村群众的生…

Windows Server 2019/2022 开启WHP,使hyperv与vmware共存

我的环境是Windows Serve 2022 Datacenter, 21H2, 需要使用Hyper-V 与 VMWare Workstation共存&#xff0c;但是在服务器管理器中找不到Windows Hypervisor Platform安装选项。在Win10中是启动关闭Windows功能中&#xff0c;而server中找不到。 解决方法&#xff1a; 以管理员…

【强训笔记】day10

NO.1 思路&#xff1a;中心扩展。从i位置开始&#xff0c;从i-1为左边和i1右边进行移动&#xff0c;字符相等就继续移动&#xff0c;直到不等&#xff0c;更新回文串长度&#xff0c;让i为左边&#xff0c;i1右边再移动&#xff0c;同样字符相等就移动&#xff0c;不等就更新长…

电商核心技术揭秘四十九:智能广告投放与效果评估

相关系列文章 电商技术揭秘相关系列文章合集&#xff08;1&#xff09; 电商技术揭秘相关系列文章合集&#xff08;2&#xff09; 电商技术揭秘相关系列文章合集&#xff08;3&#xff09; 电商技术揭秘四十一&#xff1a;电商平台的营销系统浅析 电商技术揭秘四十二&#…

【NOI-题解】1586. 扫地机器人1430 - 迷宫出口1434. 数池塘(四方向)1435. 数池塘(八方向)

文章目录 一、前言二、问题问题&#xff1a;1586 - 扫地机器人问题&#xff1a;1430 - 迷宫出口问题&#xff1a;1434. 数池塘&#xff08;四方向&#xff09;问题&#xff1a;1435. 数池塘&#xff08;八方向&#xff09; 三、感谢 一、前言 本章节主要对深搜基础题目进行讲解…

[排序算法]堆排序

目录 1.基本思想 2.堆排序的步骤 3.堆排序算法的实现 4.堆排序的特点&#xff1a; 5.总结 1.基本思想 堆排序&#xff08;Heap Sort&#xff09;的基本思想是利用堆这种数据结构进行排序。堆是一个完全二叉树&#xff0c;分为最大堆&#xff08;Max Heap&#xff09;和最…

【前端】HTML基础(3)

文章目录 前言一、HTML基础1、表格标签1.1 基本使用1.2 合并单元格 2、列表标签2.1 无序列表2.2 有序列表2.3 自定义列表 3、 表单标签2.1 form标签2.2 input标签2.3 label标签2.4 select标签2.5 textarea标签 4、无语义标签5、HTML特殊字符 前言 这篇博客仅仅是对HTML的基本结…

微服务领域的寻路者 —— Eureka深度探索与实战秘籍

文章目录 一、引言定义目标一个接地气的例子引言小结 二、Eureka架构2.1 Eureka Server一个有趣的例子2.2 Eureka Client一段简单的代码示例架构小结 三、工作流程1. 服务注册2. 心跳检测3. 服务发现4. 健康检查与失效剔除工作流程小结 四、核心机制4.1 服务注册与续约4.2 服务…

⭐⭐⭐宁波ISO9001认证:追求卓越的选择⭐⭐⭐

&#x1f308;&#x1f308;宁波ISO9001认证&#xff1a;&#x1f353;追求卓越的选择&#x1f680; &#x1f432;在追逐卓越的道路上&#xff0c;&#x1f98b;每一家企业都在寻找&#x1f426;那个能让自己腾飞&#x1f99c;的翅膀。而对我来说&#xff0c;&#x1f9a9;那个…

高精度乘法C++

1.高精度乘高精度的简单算法 思想&#xff1a;倒置相乘&#xff0c;统一处理进位&#xff0c;还原。 复杂度&#xff1a; o ( n 2 ) o(n^2) o(n2) // By SnowDream #include<bits/stdc.h> using namespace std; typedef long long ll; const int N1e510; string s1,s2…

【设计模式】单例模式的前世今生

文章目录 引言简介起航&#xff01;向“确保某个类在系统中只有一个实例”进发 ⛵️Lazy SingletonDouble-checked locking&#xff08;DCL&#xff09; SingletonVolatile SingletonAtomic SingletonMeyers Singleton 附&#xff1a;C静态对象的初始化 引言 说起单例模式&…

华为OD机试 - 分月饼 - 递归(Java 2024 C卷 200分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试…

apache基于IP和端口的虚拟主机

基于IP虚拟机主机 vim /etc/httpd/conf/httpd.conf添加监听IP Listen 192.168.0.1:80 Listen 192.168.0.10:80添加虚拟主机和发布目录 第一台虚拟主机 <VirtualHost 192.168.0.1:80>ServerAdmin www.123.comDocumentRoot /webroot/192.168.0.1ErrorLog logs/192.168.…

Splay 树简介

【Splay 树简介】 ● Treap 树解决平衡的办法是给每个结点加上一个随机的优先级&#xff0c;实现概率上的平衡。Splay 树直接用旋转调整树的形态&#xff0c;通过旋转改善树的平衡性。计算量小&#xff0c;效果好。 ● Splay 树的旋转主要分为“单旋”和“双旋”。 所谓“单旋”…

代码审计之浅谈RASP技术

前言&#xff1a; 想摆会烂&#xff0c;所以就落个笔吧。 其实本来是想写关于iast技术的&#xff0c;但是认真思考了下&#xff0c;感觉笔者自己本身也不太能讲清楚iast技术&#xff0c;怕误人子弟。 所以最后还是基于笔者的理解以及实际应用写一篇关于RASP技术的文章&#xf…

强化学习:时序差分法【Temporal Difference Methods】

强化学习笔记 主要基于b站西湖大学赵世钰老师的【强化学习的数学原理】课程&#xff0c;个人觉得赵老师的课件深入浅出&#xff0c;很适合入门. 第一章 强化学习基本概念 第二章 贝尔曼方程 第三章 贝尔曼最优方程 第四章 值迭代和策略迭代 第五章 强化学习实例分析:GridWorld…

软件游戏丢失XINPUT1_4.dll文件的多种解决方法分享

当玩家在尝试启动某款游戏时&#xff0c;遇到了系统提示“游戏找不到XINPUT1_4.dll”&#xff0c;这个错误通常发生在玩家尝试启动游戏时&#xff0c;游戏无法找到所需的XINPUT1_4.dll文件&#xff0c;呆滞无法正常启动运行。但是幸运的是&#xff0c;有一些简单的修复方法可以…

自制AI:Park_01修改bug

修改了一下不能存东西&#xff0c;不能打开东西的bug #include<bits/stdc.h> #include<windows.h> using namespace std; double mem10737418240; map<string,string> jishiben; string mulu"朴同学给你的一封信.memo\n"; int cntnote1; void sta…

软件测试与管理:黑盒测试-因果图法和场景法

知识思维导图&#xff1a; ​​​​​​​ 例题1&#xff1a;运用因果图法设计测试用例 有一个处理单价为5角钱的饮料的自动售货机软件测试用例的设计。其规格说明如下&#xff1a; 若投入5角钱或1元钱的硬币&#xff0c;按下〖橙汁〗或〖啤酒〗的按钮&#xff0c;则相应的饮料…