GoWeb -- gin框架的入门和使用

news2024/10/7 19:36:30

认识gin

go流行的web框架
go从诞生之初就带有浓重的开源属性,其原生库已经很强大,即使不依赖框架,也能进行高性能开发,又因为其语言并没有一定的设计标准,所以较为灵活,也就诞生了众多的框架,各具有特色,满足不同的喜好。

地址:https://github.com/gin-gonic/gin

go的框架其实可以理解为库,并不是用了某一个框架就不能用别的框架,可以选择性的使用各个库中的优秀组件,进行组合

gin介绍

Gin 是一个基于 Go 语言编写的 Web 框架,它提供了类似于 Martini 框架但性能更好的 API 服务。Gin 框架的主要特点包括:

  • 高性能:Gin 使用了高性能的 httprouter 作为其底层的 HTTP 路由器,速度提升了近 40 倍。
  • 易用性:Gin 提供了简单好用的核心上下文 Context,以及丰富的工具集,如 JSON/XML 响应、数据绑定与校验等。
  • 路由与中间件:Gin 提供了优雅的路由/中间件系统,支持中间件传入的 HTTP 请求经由一系列中间件和最终操作来处理,例如 Logger、Authorization、GZIP 以及最终的 DB 操作。
  • Crash 处理:Gin 框架可以捕获发生在 HTTP 请求中的 panic 并 recover 它,从而保证服务器始终可用。
  • JSON 验证:Gin 框架可以解析并验证 JSON 格式的请求数据,例如检查某个必须值是否存在。
  • 路由群组:Gin 支持通过路由群组来更好地组织路由,例如是否需要授权、设置 API 的版本等。
  • 无限制的群组嵌套:Gin 支持无限制的路由群组嵌套,不会降低性能。

总之,Gin 是一个高效、易用且功能丰富的 Web 框架,适合用于开发高性能的 Web 应用程序。

gin的安装

首先进行开发环境的准备

mkdir ginlearn

先创建项目目录
进入目录 再使用go work init 命令初始化

go mod init test.com/helloworld
go work use ./helloworld

在这里插入图片描述
然后就可以使用go get命令下载gin框架

在这里插入图片描述
在这里插入图片描述
现在开发环境已经准备好了

第一个gin程序

在项目目录下新建一个main.go,并在里面写入以下代码:

package main

import (
	"github.com/gin-gonic/gin"
	"log"
)

func main() {
	r := gin.Default()
	//curl http://localhost:8080/hello 获取到json返回值
	//{“name”:"hello world"}
	r.GET("/hello", func(context *gin.Context) {
		context.JSON(200, gin.H{
			"name": "hello world",
		})
	})
	err := r.Run(":8080")
	if err != nil {
		log.Fatal(err)
	}
}

然后在浏览器里 访问 http://localhost:8080/hello 就可以看到以下内容

在这里插入图片描述

路由

路由是URI到函数的映射
一个URI含: http://localhost:8080/user/find?id=11

  • 协议,比如http,https等
  • ip端口或者域名,比如127.0.01:8080或者www.test.com
  • path ,比如/path
  • query,比如?query

同时访问的时候,还需要指明http method 比如get post 等

RESTful API规范

RESTful API的规范建议我们使用特定的HTTP方法来对服务器上的资源进行操作。
比如:
GET 表示读取服务器上的资源
POST 表示在服务器上的创建资源
PUT 表示更新或者替换服务器上的资源
DELETE 表示删除服务器上的资源

请求方法

	r.GET("/get", func(ctx *gin.Context) {
		ctx.JSON(200, "get")
	})
	r.POST("/save", func(ctx *gin.Context) {
		ctx.JSON(200, "save")
	})
	r.PUT("/update", func(ctx *gin.Context) {
		ctx.JSON(200, "update")
	})
	r.DELETE("/delete", func(ctx *gin.Context) {
		ctx.JSON(200, "delete")
	})

Any代表任意一种类型都支持

r.Any("/any", func(context *gin.Context) {
		context.JSON(200,gin.H{
			"name":"any",
		})

URI

URI书写的时候,我们不需要关心scheme和authority这两部分,我们主要通过path和query两部分的书写来进行资源的定位。

  • 静态url,比如/hello, /user/find
r.POST("/user/find",func(ctx *gin.Context){
})
  • 路径参数 比如/user/find/:id
r.GET("/get/find/:id", func(ctx *gin.Context) {
		ctx.JSON(200, ctx.Param("id"))
	})

在这里插入图片描述

  • 模糊匹配,比如/user/*path
	r.GET("/get/*path", func(ctx *gin.Context) {
		ctx.JSON(200, ctx.Param("path"))
	})

在这里插入图片描述

处理函数

定义:

type HandlerFUnc func(*Context)

通过上下文的参数,获取http的请求参数,响应http请求等。

分组路由

在进行开发的时候,我们往往要进行模块的划分,比如用户模块,以user开发,商品模块,以goods开头。或者进行多版本开发,不同版本之间路径是一致的,这种时候,就可以用到分组路由了。

	v1 := r.Group("/v1")
	{
		v1.GET("/find", func(ctx *gin.Context) {
			ctx.JSON(200, "find")
		})
		v1.GET("/save", func(ctx *gin.Context) {
			ctx.JSON(200, "save")
		})
	}

	v2  := r.Group("/v2")
	{
		v2.GET("/find", func(ctx *gin.Context) {
			ctx.JSON(200, "find")
		})
		v2.GET("/save", func(ctx *gin.Context) {
			ctx.JSON(200, "save")
		})
	}

请求参数

GET请求参数

使用Get请求传参时,类似于这样http://localhost:8080/user/save?id=11&name=zhangsan

普通参数

request url : http://localhost:8080/user/save?id=11&name=zhangsan

参数后面的部分叫做Query

	r.GET("/user/save", func(context *gin.Context) {
		id := context.Query("id")
		name := context.Query("name")
		context.JSON(200, gin.H{
			"id":   id,
			"name": name,
		})
	})

所以使用context.Query()函数就能获取该格式的参数

在这里插入图片描述
context.GetQuery()可以指明没有的参数:

	r.GET("/user/save", func(context *gin.Context) {
		id := context.Query("id")
		name := context.Query("name")
		address, ok := context.GetQuery("address")
		context.JSON(200, gin.H{
			"id":      id,
			"name":    name,
			"address": address,
			"ok":      ok,
		})
	})

在这里插入图片描述
context.DefaultQuery()可以设置默认值:

	r.GET("/user/save", func(context *gin.Context) {
		id := context.Query("id")
		name := context.Query("name")
		address := context.DefaultQuery("address", "beijing")
		context.JSON(200, gin.H{
			"id":      id,
			"name":    name,
			"address": address,
		})
	})

在这里插入图片描述

还有另一种方式获取到get请求中的参数 就是使用结构体与这种格式的请求参数进行绑定

首先需要声明一个结构体(需要先进行绑定)

type User struct {
	Id   int64  `form:"id""`
	Name string `form:"name""`
}

然后在处理的GET请求中编写如下代码:

	r.GET("/user/save", func(context *gin.Context) {
		var user User
		err := context.BindQuery(&user)
		if err != nil {
			log.Println(err)
		}

		context.JSON(200, user)
	})

主要是通过context.BindQuery(&user)的方法与实例化出来的结构user进行绑定。

在这里插入图片描述
context.ShouldBindQuery(&user)会更高级一些

数组参数

请求url:http://localhost:8080/user/get/?address=Beijing&address=shanghai

都是address=xxx , 这里就需要用数组的形式去接收参数。

r.GET("/user/get", func(context *gin.Context) {
		address := context.QueryArray("address")
		context.JSON(200, address)
	})

在这里插入图片描述

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

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

相关文章

使用朴素贝叶斯过滤垃圾邮件

使用朴素贝叶斯过滤垃圾邮件 文章目录 使用朴素贝叶斯过滤垃圾邮件流程准备数据构建训练集和测试集分类电子邮件 完整测试代码:欢迎关注公众号【三戒纪元】 朴素贝叶斯的最著名的应用:过滤电子邮件垃圾。 流程 收集数据:提供文本文件准备数据…

【ISO14229_UDS刷写】-3-$36诊断服务TransferData理论部分

总目录:(单击下方链接皆可跳转至专栏总目录) 《UDS/OBD诊断需求编辑工具》总目录https://blog.csdn.net/qfmzhu/article/details/123697014 目录 1 $0x36 TransferData诊断服务描述 2 0x36服务请求消息 2.1 0x36服务请求消息定义 2.2 0…

【C++系列P1】带上这篇基础小宝典,向特性奇多的C++进发吧!勇士们!(持续更新ing~)

前言 大家好吖,欢迎来到 YY 滴 C系列 ,热烈欢迎!(持续更新ing~)本章主要内容面向刚刚学完C语言,准备或正在接触C的老铁。而往往C奇多的小特性和知识点让铁铁们头晕晕脑涨涨,因而本章收纳了许多C中零散的知识…

跨境电商系统源码分享,解决你的电商难题

作为跨境电商领域的专家,我在这里为你分享跨境电商系统源码,帮助你解决各种电商难题!本文将为你提供全面而专业的指导,让你的电商之路更加顺畅。 为什么选择跨境电商系统源码? 跨境电商系统源码是现代电商业务管理的…

MongoDB超全语法大全

MongoDB 安装教程 一、介绍 mongodb数据库是非关系数据库,mongodb中没有表的概念,数据都是存储在集合中 易扩展: NoSQL数据库种类繁多, 但是⼀个共同的特点都是去掉关系数据库的关系型特性。 数据之间⽆关系, 这样就…

如何运行Node.js脚本及读取环境变量

目录 1、如何从CLI 运行Node.js 脚本 2、将字符串作为参数传递到节点,而不是文件路径 3、自动重新启动应用程序 4、如何从Node.js中读取环境变量 1、如何从CLI 运行Node.js 脚本 运行Node.js程序的通常方法是运行全局可用的Node命令(一旦安装Node.js…

[论文分享] When deep learning met code search

When deep learning met code search [ESEC/FSE 2019] Jos Cambronero MIT CSAIL U.S.A. Hongyu Li Facebook, Inc. U.S.A. SeohyunKim Facebook,Inc. U.S.A. KoushikSen EECSDepartment,UCBerkeley U.S.A. SatishChandra Facebook,Inc. U.S.A. 最近有多个关于使用深度神经网…

ASP.NET 未能找到类型或命名空间名称“HttpRequestMessage”

引入System.Net.Http后,运行页面还是报错 using System.Net.Http;chatGPT解释需要安装Microsoft.AspNet.WebApi.Client包,IIS安装的包文件存储在bin目录下,安装包后bin目录多出了一些列文件 运行页面后还是报错 需要在web.config配置文件…

【ISO14229_UDS刷写】-6-$34,$35,$36,$37诊断服务用于downloading下载/uploading上载数据的消息流示例

总目录:(单击下方链接皆可跳转至专栏总目录) 《UDS/OBD诊断需求编辑工具》总目录https://blog.csdn.net/qfmzhu/article/details/123697014【ISO14229_UDS刷写】-1-$34诊断服务RequestDownload理论部分https://blog.csdn.net/qfmzhu/article…

VM600 CPUR2 机架控制器和通信接口卡

VM600 CPUR2和IOCR2机架控制器和通信接口卡对是一个中央处理器(CPU)卡对,作为Meggitt振动计产品线中VM600机架机械保护系统(MPS)和/或状态监控系统(CMS)的系统控制器和数据通信网关。 注:不同版本的CPUx/IOCx框架控制器和通信接口卡对可用,如下所示: C…

初探 Compose for Wear OS:实现一个简易选择APP

前言 俗话说,人生有三大难题:早上吃啥、中午吃啥、晚上吃啥。 这个问题一度困扰着无数的人,直到一款帮你选择吃什么的神器《今天吃啥》出现,人们再也不用为了每天吃啥而犯愁了。 哈哈,以上纯属抖机灵。 最近访问谷歌…

Spring MVC数据绑定和响应

数据绑定 在程序运行时,Spring MVC接收到客户端的请求后,会根据客户端请求的参数和请求头等数据信息,将参数以特定的方式转换并绑定到处理器的形参中。Spring MVC中将请求消息数据与处理器的形参建立连接的过程就是Spring MVC的数据绑定。 …

电力监控系统在中原科技城智慧能源配电工程中的应用

摘 要:随着社会经济的快速发展,我国变电站正朝着现代化的方向不断发展,自动化设备以及继电保护装置凭借自身优异性能而获得广泛应用。本文介绍的AM5SE系列的微机保护装置,可以针对中原科技城智慧能源配电工程中不同保护对象提供对…

真无线蓝牙耳机什么牌子好?盘点五款质量好的蓝牙耳机

相信很多人都有过这样的经历,早 晚高峰像沙丁鱼般被挤在公交或地铁上,嘈杂的环境、工作的劳累让你只想听听音乐追追剧,给自己一些放松的时光。可拿出有线耳机却常常被挤掉,更有被扯到耳朵的时候。想换一款蓝牙耳机,但面…

Kubernetes 证书详解

K8S 证书介绍 在 Kube-apiserver 中提供了很多认证方式,其中最常用的就是 TLS 认证,当然也有 BootstrapToken,BasicAuth 认证等,只要有一个认证通过,那么 Kube-apiserver 即认为认证通过。下面就主要讲解 TLS 认证。 …

chatgpt赋能python:Python动作捕捉:何为动作捕捉及其应用

Python动作捕捉:何为动作捕捉及其应用 介绍 动作捕捉是一种技术,可将人或物体的运动转换为数字形式。在过去的几十年里,动作捕捉已被广泛应用于电影制作、游戏开发、医学研究等领域。 Python是一种功能强大的编程语言,已成为许…

AI 工具分享第 4 期:13 款国外免费AI视频生成工具

0. 未来百科 未来百科,是一个知名的AI产品导航网站 —— 为发现全球优质AI工具而生 。目前已 聚集全球3000优质AI工具产品 ,旨在帮助用户发现全球最好的AI工具,同时为研发AI垂直应用的创业公司提供展示窗口,迎接未来的AI时代。未来…

Revit建模|Revit风管怎么绘制?

​绘制风管是机电工程重要的一环,对于不少刚接触Revit的小伙伴来说似乎还无从下手,今天就让小编来告诉大家在Revit中绘制风管的方法。 一、在Revit绘制风管 第一步:首先我们先在revit的界面中项目文件找到风管。 第二步:打开后我…

医疗IT系统安科瑞隔离电源装置在医院的应用

【摘要】介绍该三级综合医院采用安科瑞隔离电源系统5件套,使用落地式配电柜安装方式,从而实现将TN系统转化为IT系统,以及系统绝缘情况监测。 【关键词】医用隔离电源系统;IT系统;绝缘情况监测;三级综合医院…

tektronix泰克TDS3054数字荧光示波器

tektronix TDS3054是泰克TDS3000系列示波器,它是一种新的图形界面操作模式,称为QuickMenu。这种快速访问的用户界面使得主要的示波器控制访问一个单一的按键。每一个示波器都包含一个在示波器中运行的在线巡览盘。此磁盘提供了产品的操作和功能的概述。 …