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,一经查实,立即删除!

相关文章

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

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

【强训笔记】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; 三、感谢 一、前言 本章节主要对深搜基础题目进行讲解…

【前端】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;那个…

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

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

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;有一些简单的修复方法可以…

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

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

[方法] Unity 实现仿《原神》第三人称跟随相机 v1.1

参考网址&#xff1a;【Unity中文课堂】RPG战斗系统Plus 在Unity游戏引擎中&#xff0c;实现类似《原神》的第三人称跟随相机并非易事&#xff0c;但幸运的是&#xff0c;Unity为我们提供了强大的工具集&#xff0c;其中Cinemachine插件便是实现这一目标的重要工具。Cinemachi…

4步快速配置Java和MySQL环境

每次入职一家新公司或者用一台其他的临时电脑或者新电脑时都要重新配置Java开发环境&#xff0c;很麻烦&#xff0c;因此我在这里记录一下快速配置环境的方式&#xff0c;四步搞定&#xff01;此处以win为操作系统进行讲解。 第一步&#xff1a;下载链接 下载链接&#xff1a…

04.1.添加多个监控同步其他主机

添加多个监控&同步其他主机 1.首先在agent配置文件中存在Include的&#xff0c;也就是说明&#xff0c;可以配置多个监控项并且同步到其他主机上的进行使用&#xff1b; 2.主机之间互相推送配置文件即可&#xff1b; 开始测试 我这里实在agent节点上直接在路径/etc/zabbi…

Go实现树莓派控制舵机

公式说明 毫秒&#xff08;ms&#xff09;是时间的单位&#xff0c;赫兹&#xff08;Hz&#xff09;是频率的单位&#xff0c;而DutyMax通常是一个PWM&#xff08;脉冲宽度调制&#xff09;信号中表示最大占空比的值。以下是它们之间的关系和一些相关公式&#xff1a; 频率&…

设计模式之建造者模式BuilderPattern(七)

一、建造者模式 建造者模式&#xff08;Builder Pattern&#xff09;使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 二、代码实例 1、OrderItem类 Data&#xff1a;这是Lombok中提供的Ge…

ADS过孔---过孔建模自动化

当前快速建模的方法有两类&#xff1a;一是脚本自动化&#xff0c;也就是今天要分享的方法&#xff0c;但该方法需要工程师有基本的脚本编辑能力&#xff0c;然后根据自己的需要去修改&#xff0c;难度较大一点点&#xff1b;二是参数化建模&#xff0c;也就是在GUI界面输入相应…

百度语音识别开发笔记

目录 简述 开发环境 1、按照官方文档步骤开通短语音识别-普通话 2、创建应用 3、下载SDK 4、SDK集成 5、相关接口简单说明 5.1权限和key 5.2初始化 5.3注册回调消息 5.4开始转换 5.5停止转换 6、问题 简述 最近想做一些语音识别的应用&#xff0c;对比了几个大厂…