【GoWeb框架初探————Gin篇】

1. Gin

1.1 下载相应依赖

创建go项目,在项目下建立go.mod文件(若有则跳过)
命令行运行

go get github.com/gin-gonic/gin

1.2 启动一个简单Web服务

package mainimport ("github.com/gin-gonic/gin""github.com/thinkerou/favicon""net/http"
)func main() {// 获取一个gin默认的服务器ginServer := gin.Default()// 修改网站在浏览器的iconginServer.Use(favicon.New("./icon/img.png"))// 访问地址,处理我们的请求		Request   ResponseginServer.GET("/hello", func(context *gin.Context) {context.JSON(http.StatusOK, gin.H{"msg": "hello,world"})})// 返回界面// 服务端口ginServer.Run(":8083")
}

1.3 Gin中的Restful风格API

	// Gin RestFul风格ginServer.GET("/user", func(context *gin.Context) {context.JSON(http.StatusOK, gin.H{"msg": "GET,user"})})ginServer.POST("/user", func(context *gin.Context) {context.JSON(http.StatusOK, gin.H{"msg": "POST,user"})})ginServer.PUT("/user", func(context *gin.Context) {context.JSON(http.StatusOK, gin.H{"msg": "PUT,user"})})ginServer.DELETE("/user", func(context *gin.Context) {context.JSON(http.StatusOK, gin.H{"msg": "DELETE,user"})})

1.4 如何返回网页

func main() {// 创建一个服务ginServer := gin.Default()// 修改网站在浏览器的iconginServer.Use(favicon.New("./icon/img.png"))// 加载静态页面ginServer.LoadHTMLGlob("templates/*")// 加载资源文件ginServer.Static("/static", "./static")// 响应一个页面给前端ginServer.GET("index", func(context *gin.Context) {context.HTML(http.StatusOK, "index.html", gin.H{"msg": "这是后台来的数据"})})// 服务端口ginServer.Run(":8083")
}

前端html界面使用参数的方法类似于vue中的操作

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>我的一个Go Web界面</title><link rel="stylesheet" href="/static/css/style.css"><script src="/static/js/common.js"></script>
</head>
<body>
太强啦!
获取后端数据为:{{.msg}}
</body>
</html>

在这里插入图片描述

1.5 如何从请求中获取参数

	// url?userid=xxx&username=kuangshenginServer.GET("/user/info", func(context *gin.Context) {userid := context.Query("userid")username := context.Query("username")context.JSON(http.StatusOK, gin.H{"userid":   userid,"username": username,})})// /user/info/1/kuangshenginServer.GET("user/info/:userid/:username", func(context *gin.Context) {context.JSON(http.StatusOK, gin.H{"userid":   context.Param("userid"),"username": context.Param("username"),})})// 前端给后端传递jsonginServer.POST("/json", func(context *gin.Context) {body, _ := context.GetRawData()var m map[string]interface{}// 序列化包装为json_ = json.Unmarshal(body, &m)context.JSON(http.StatusOK, m)})// 处理表单的数据ginServer.POST("/user/add", func(context *gin.Context) {context.JSON(http.StatusOK, gin.H{"userid":   context.PostForm("userid"),"username": context.PostForm("username"),})})

1.6 路由和重定向

	// 重定向ginServer.GET("/test", func(context *gin.Context) {// 重定向context.Redirect(http.StatusMovedPermanently, "https://baidu.com")})// 404 NoRouteginServer.NoRoute(func(context *gin.Context) {context.HTML(http.StatusNotFound, "404.index", nil)})// 路由组userGroup := ginServer.Group("/user"){userGroup.GET("/add")userGroup.POST("/login")userGroup.POST("/logout")}v1api := ginServer.Group("/v1")v1api.GET("/jack", func(context *gin.Context) {context.String(http.StatusOK, "版本v1的jack")})

1.7 中间件/拦截器

预处理、登录授权、验证、分页…耗时统计
我们查看GET等请求的参数时,发现第二个参数是…HandlerFunc,表示这是一个可变长的参数,会依次进过这些处理器进行处理。

// 自定义Go中间件
func myHandler() gin.HandlerFunc {return func(context *gin.Context) {// 通过自定义的中间值,设置的值,在后续处理只要调用了这个中间件的都可以拿到这里的参数context.Set("usersSession", "userId-1")context.Next()  //放行context.Abort() //阻止}
}//func (group *RouterGroup) GET(relativePath string, handlers ...HandlerFunc) IRoutes
//也就是说,我们可以通过这样的方式来让请求依次通过多个handler
ginServer.POST("/user/add",myHandler() ,func(context *gin.Context) {context.JSON(http.StatusOK, gin.H{"userid":   context.PostForm("userid"),"username": context.PostForm("username"),"usersSession": context.MustGet("usersSession").(string)})
})

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

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

相关文章

通过Admission Webhook限制Namespace下Nodeport Service的端口范围

背景 要给每个namspce分配Nodeport 端口范围, 不允许使用范围之外的端口. 实现对平台 nodeport 端口的统一管理 方案 Kubernetes本身不支持直接限制NodePort的范围。可以通过创建一个Admission Webhook来拦截Service创建请求&#xff0c;并在其端口字段中进行检查和限制。 …

MYSQL中如何插入、更新和删除数据

目录 一、插入(INSERT) 1.插入一行 2.插入多行 3.插入检索出的数据 二、更新(UPDATE) 三、删除(DELETE) 四、更新和删除使用时需要注意&#xff1a; *本节总结于图灵程序设计丛书&#xff0c;数据库系列——《MySQL必知必会》 一、插入(INSERT) 1.插入一行 ①INSERT I…

新手入门:大语言模型训练指南

在这个信息爆炸的时代&#xff0c;人工智能技术正以前所未有的速度渗透到我们生活的方方面面。从智能手机上的语音助手到自动驾驶汽车&#xff0c;AI的应用无处不在。而在这些令人惊叹的技术背后&#xff0c;大语言模型&#xff08;LLM&#xff09;扮演着至关重要的角色。它们不…

国外问卷调查如何做?需要借助海外住宅IP吗?

在数字化时代&#xff0c;国外问卷调查不仅是了解市场需求的重要手段&#xff0c;还成为了一项能够赚取额外收入的方式。随着全球范围内消费者行为的多样化&#xff0c;各类企业和机构越来越需要了解不同地区的用户观点和偏好&#xff0c;以优化产品和服务。 一、国外问卷调查…

C++ 比较三个数的大小

int maxValue,minValue; maxValue xSize > ySize ? xSize : ySize; maxValue maxValue > zSize ? maxValue : zSize;minValue xSize < ySize ? xSize : ySize; minValue minValue<zSize?minValue:zSize;int maxValue xSize > ySize ? xSize > zSize…

每日算法4.17

力扣287寻找重复数 给定一个包含 n 1 个整数的数组 nums &#xff0c;其数字都在 [1, n] 范围内&#xff08;包括 1 和 n&#xff09;&#xff0c;可知至少存在一个重复的整数。 假设 nums 只有 一个重复的整数 &#xff0c;返回 这个重复的数 。 你设计的解决方案必须 不修…

基于flink cdc技术,在不停机情况下完成新老系统数据迁移解决方案

1.业务场景及痛点描述 当前随着业务发展&#xff0c;由于公司是做海外业务&#xff0c;公司前几年搭建了官网商城&#xff0c;并积累了一定的用户量&#xff0c;然后去年&#xff0c;由于公司发展智能机器人业务&#xff0c;开发了手机APP&#xff0c;供用户控制机器人&#xf…

设计模式(工厂方法-Factory Method)结构|原理|优缺点|场景|示例

目录 设计模式&#xff08;分类&#xff09; 设计模式&#xff08;六大原则&#xff09; 创建型 工厂方法 抽象工厂模式 单例模式 建造者模式 设计模式中的工厂方法&#xff08;Factory Method&#xff09;是一种创建型模式&#xff…

我与C++的爱恋:日期计算器

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;我与C的爱恋 朋友们大家好啊&#xff0c;在我们学习了默认成员函数后&#xff0c;我们通过上述内容&#xff0c;来实现一个简易的日期计算器。 ​ ​ 头文件的声明 #pragma once #incl…

面试经典-Redis数据库的数据倾斜

一、定义 对于集群系统&#xff0c;一般缓存是分布式的&#xff0c;即不同节点负责一定范围的缓存数据。我们把缓存数据分散度不够&#xff0c;导致大量的缓存数据集中到了一台或者几台服务节点上&#xff0c;称为数据倾斜。一般来说数据倾斜是由于负载均衡实施的效果不好引起…

K8S调度下的ingress-controller集群的实现以及nginx配置

# 22、K8S调度下的ingress-controller集群的实现以及nginx配置 目标&#xff1a; 1. 实现ingress-controller的集群部署 实现方法&#xff1a; 1. 为ingress-controller 规划两个节点 2.将这两个节点 打上自定义的 label 3.修改yaml文件&#xff0c;并重新创建 ingress-co…

签约棒球自由球员算法设计

签约棒球自由球员算法设计 1. 问题描述2. 算法设计2.1 动态规划2.2 状态转移方程2.3 初始化2.4 最终结果 3. 算法实现3.1 伪代码3.2 C代码示例 1. 问题描述 假设你是一支棒球大联盟球队的总经理。在赛季休季期间&#xff0c;你需要签入一些自由球员。球队老板给你的预算为 X美…

攻防世界fileclude题解

攻防世界fileclude题解 ​​ 题目要求file1和file2参数不能为空 且file2这个文件内容值为hello ctf&#xff0c;用php://input 然后POST体内输入hello ctf即可满足这个if条件 满足这个条件后就会包含file1变量所指定的那个文件。用php伪协议来跨目录包含一下flag.php文件就可以…

人工智能培训老师叶梓:如何通过Prompt优化提升GPT-4性能

在人工智能领域&#xff0c;尤其是自然语言处理&#xff08;NLP&#xff09;中&#xff0c;Prompt工程是一种通过精心设计的提示&#xff08;prompt&#xff09;来引导模型生成期望输出的技术。最近&#xff0c;微软的研究团队通过Prompt优化策略&#xff0c;在医疗领域取得了显…

Redis系列1:深刻理解高性能Redis的本质

1 背景 分布式系统绕不开的核心之一的就是数据缓存&#xff0c;有了缓存的支撑&#xff0c;系统的整体吞吐量会有很大的提升。通过使用缓存&#xff0c;我们把频繁查询的数据由磁盘调度到缓存中&#xff0c;保证数据的高效率读写。 当然&#xff0c;除了在内存内运行还远远不够…

K3S 证书有效期和续签问题

本文使用k3s版本&#xff1a;k3s version v1.24.17k3s1 (026bb0ec) 默认安装情况下&#xff0c;ca证书有效期是10年&#xff0c;普通证书有效期是1年。 普通证书 k3s官网描述&#xff1a;K3s 客户端和服务器证书自颁发日起 365 天内有效。每次启动 K3s 时&#xff0c;已过期或…

linux 云计算平台基本环境(知识准备篇)

为了更多的了解云计算平台&#xff0c;结合云计算和linux的知识写了一篇云计算的介绍和汇总。 文章目录 前言1. centos的软件管理1.1 yum软件包管理1.1.1 yum命令语法&#xff1a;1.1.2 安装软件包的步骤1.1.3 yum源 2. 主机名管理与域名解析3. centos的防火墙管理4. openstack…

java锁介绍

乐观锁 乐观地认为并发访问不会造成数据冲突&#xff0c;只在更新时检查是否有冲突。乐观锁和CAS的关系可以用“乐观锁是一种思想&#xff0c;CAS是一种具体的实现”来理解。 当使用CAS操作修改数据时&#xff0c;如果版本号不匹配或者其他线程已经修改了要操作的数据&#x…

面试题集中营—分布式共识算法

分布式共识算法目标 分布式主要就是为了解决单点故障。一开始只有一个服务节点提供服务&#xff0c;如下图所示。那么如果服务节点挂了&#xff0c;对不起等着吧。 为了服务的高可用性&#xff0c;我们一般都会多引入几个副节点当备份&#xff0c;当服务节点挂了&#xff0c;就…

记一次Mac(M1)交叉编译Windows系统的过程

做了一个导出文件项目来实践学习GO的成果&#xff0c;开发完成后&#xff0c;在本地调试环境一切正常&#xff0c;打包到Windows测试出现了报错Error: Binary was compiled with CGO_ENABLED0, go-sqlite3 requires cgo to work. This is a stub。后研究得知&#xff0c;gorm的…