GIN

gin是什么 

Gin 是一个用 Go (Golang) 编写的 HTTP Web 框架。 它具有类似 Martini 的 API,但性能比 Martini 快 40 倍。如果你需要极好的性能,使用 Gin 吧。

特点:gin是golang的net/http库封装的web框架,api友好,注释明确,具有快速灵活,容错方便等特点。

go其他web框架:

  • beego:开源的高性能Go语言Web框架。
  • Iris:全宇宙最快的Go语言Web框架,支持MVC。

gin的安装

        go语言包的安装都十分简单,对与gin的安装,仅需要一行命令(开启go mod,并且配置了正确的代理)

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

gin框架中文文档:https://gin-gonic.com/zh-cn/docs/

gin的使用

使用gin创建一个hello world网页

package main

import "github.com/gin-gonic/gin"

func main() {
	router := gin.Default()

	router.GET("/hello", func(c *gin.Context) {
		c.JSON(200, gin.H{"message": "Hello World!"})
	})

	router.Run("127.0.0.1:8080")
}

启动成功:

 十分的快捷简单!!!!😆😆😆😆

RESTful API

55RESTful:用url去定位资源、用HTTP动词GET、POST、DELETE、PUT去描述操作。

RESTful API就是REST风格的API,rest是一种架构风格,跟编程语言无关,跟平台无关,采用HTTP做传输协议。

REST的含义就是客户端与Web服务器之间进行交互的时候,使用HTTP协议中的4个请求方法代表不同的动作。

  • GET获取资源
  • POST新建资源
  • PUT更新资源
  • DELETE删除资源

只要API程序遵循了REST风格,就可以成为RESTful API。

Gin框架支持RESTful API的开发

	router.GET("/get", func(c *gin.Context) {
		c.JSON(200, gin.H{"message": "get"})
	})

	router.POST("/post", func(c *gin.Context) {
		c.JSON(200, gin.H{"message": "post"})
	})

	router.PUT("/put", func(c *gin.Context) {
		c.JSON(200, gin.H{"message": "put"})
	})

	router.DELETE("/delete", func(c *gin.Context) {
		c.JSON(200, gin.H{"message": "delete"})
	})

 

响应HTML页面

目录:

main.go

package main

import (
	"github.com/gin-gonic/gin"
	"github.com/thinkerou/favicon"
	"net/http"
)

func main() {
	router := gin.Default()

	router.GET("/index", func(c *gin.Context) {
		c.HTML(http.StatusOK, "index.html", gin.H{
			"message": "myHTML",
		})
	})

	// Gin框架中使用LoadHTMLGlob()或者LoadHTMLFiles()方法进行HTML模板渲染。
	//router.LoadHTMLGlob("template/*")
	router.LoadHTMLFiles("template/index.html")

	// 当我们渲染的HTML文件中引用了静态文件时
	// 我们只需要按照以下方式在渲染页面前调用gin.Static方法即可。
	router.Static("/static", "./static")

	router.Run("127.0.0.1:8080")
}

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>我的Go页面</title>
    <link rel="stylesheet" href="/static/css/style.css">
    <script src="/static/js/common.js"></script>
</head>
<body>
    <h1>首页</h1>
</body>
</html>

 style.css

body {
    background: rosybrown;
}

 

        css,js之后也会出文章

JSON响应

1、返回普通数据类型

router.GET("/hello", func(c *gin.Context) {
		c.JSON(200,"request success")
	})

2、返回结构体

	router.GET("/hello", func(c *gin.Context) {
		user := struct {
			Username string `json:"username"`
			PassWord string `json:"password"`
		}{
			Username: "zhangsan",
			PassWord: "123456",
		}
		
		c.JSON(http.StatusOK, user)
	})

3、返回map

	router.GET("/hello", func(c *gin.Context) {
		type user struct {
			Username string `json:"username"`
			PassWord string `json:"password"`
		}

		m := map[int]user{}

		m[1] = user{"zhangsan", "123456"}
		m[2] = user{"lisi", "123456"}

		c.JSON(http.StatusOK, m)
	})

4、返回切片结构体

	router.GET("/hello", func(c *gin.Context) {
		type user struct {
			Username string `json:"username"`
			PassWord string `json:"password"`
		}

		users := make([]user, 2)
		users[0] = user{"zhangsan", "123456"}
		users[1] = user{"lisi", "123456"}

		c.JSON(http.StatusOK, users)
	})

获取请求参数

1、获取url中的参数

        当form表单中的method属性为get我们提交的字段值会显示在url中

	router.GET("/login", func(c *gin.Context) {
		c.HTML(200, "login.html", nil)
	})

	router.LoadHTMLGlob("template/*")

获取url中的参数方法:

	router.GET("/login", func(c *gin.Context) {

		username := c.Query("username")
		password, ok := c.GetQuery("password")
		if !ok {
			password = "获取password失败"
		}

		c.JSON(http.StatusOK, gin.H{
			"username": username,
			"password": password,
		})

	})

2、接收restful风格的参数

请求的参数通过URL路径传递,例如:/login/zhangsan/123456。 获取请求URL路径中的参数的方式如下。

	router.GET("/login/:username/:password", func(c *gin.Context) {

		// 通过 param 获取参数
		username := c.Param("username")
		password := c.Param("password")

		//返回json数据
		c.JSON(http.StatusOK, gin.H{
			"username": username,
			"password": password,
		})
	})

3、接收form表单提交的数据

	router.POST("/login", func(c *gin.Context) {

		username := c.PostForm("username")
		password := c.PostForm("password")

		c.JSON(http.StatusOK, gin.H{
			"username": username,
			"password": password,
		})
	})

4、获取json参数

当前端请求的数据通过JSON提交时,例如向/json发送一个POST请求,则获取请求参数的方式如下:

// 编写请求
router.POST("/json", func(c *gin.Context) {
   // GetRawData : 从c.Request.Body读取请求数据, 返回 []byte
   b, _ := c.GetRawData()
   // 定义map或结构体接收
   var m map[string]interface{}
   // 包装为json数据
   _ = json.Unmarshal(b, &m)

   c.JSON(http.StatusOK, m)
})

路由

1、重定向

http重定向

	//重定向
	router.GET("/test", func(c *gin.Context) {
		c.Redirect(http.StatusMovedPermanently, "http://www.google.com")
	})

2、路由重定向

	router.GET("/test", func(c *gin.Context) {
		c.Request.URL.Path = "/test2"
		router.HandleContext(c)
	})

	router.GET("/test2", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{"message": "test2"})
	})

3、404页面

没有匹配到路由的请求都返回404.html页面。

	router.NoRoute(func(c *gin.Context) {
		c.HTML(http.StatusNotFound, "404.html", nil)
	})

4、路由组

我们可以将拥有共同URL前缀的路由划分为一个路由组,也可以多重嵌套。

package main

import "github.com/gin-gonic/gin"

func Group(router *gin.Engine) {

	userGroup := router.Group("/user")
	{ //习惯性一对`{}`包裹同组的路由,这只是为了看着清晰,你用不用`{}`包裹功能上没什么区别
		userGroup.GET("/1", func(c *gin.Context) {}) //   /user/1
		userGroup.GET("/2", func(c *gin.Context) {}) //   /user/2
		userGroup.GET("/3", func(c *gin.Context) {}) //   /user/3
	}
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

初始Python篇(13)—— 模块以及Python中常用的内置模块

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; Python 目录 模块的概念 模块的导入 包的概念以及使用 主程序运行 Python中常用的内置模块 random模块 time模块 datetime模块 …

时间序列异常值检测方法

文章目录 一、基于统计的方法1.1、标准差1.2、箱线图1.3、Z-Score法 二、基于机器学习算法的方法2.1、K-NN2.2、孤立森林 三、基于密度的方法3.1、LOF3.2、DBSCAN密度聚类 时间序列相关参考文章&#xff1a; 时间序列预测算法—ARIMA 时间序列预测算法—Prophet 时间序列分类任…

8K+Red+Raw+ProRes422分享5个影视级视频素材网站

Hello&#xff0c;大家好&#xff0c;我是后期圈&#xff01; 在视频创作中&#xff0c;电影级的视频素材能够为作品增添专业质感&#xff0c;让画面更具冲击力。无论是广告、电影短片&#xff0c;还是品牌宣传&#xff0c;高质量的视频素材都是不可或缺的资源。然而&#xff…

顺序表的操作

注意位序和数组下标的关系 插入&#xff1a; 插入的时间复杂度&#xff1a; 最深层语句&#xff1a; 最好情况 最坏情况 平均情况 删除&#xff1a; 查找&#xff1a;

五、windows上vscode构建c/c++环境

1、安装vscode 官网下载界面&#xff1a;https://code.visualstudio.com/Download 请根据电脑系统安装所需版本点击下载链接&#xff08;一般情况下点击windows按钮即可&#xff09;鼠标左键双击&#xff0c;即可运行安装程序&#xff0c;点击【确认】&#xff1b;选择安装路径…

Spring实例化的基本流程和Bean处理器

目录 Spring实例化的基本流程 Bean的处理器 Bean工厂后处理器&#xff08;BeanFactoryPostProcessor&#xff09; 动态注册beanDefinition Bean后处理器&#xff08;BeanPostProcessor&#xff09; Spring实例化的基本流程 在了解处理器之前&#xff0c;要清除spring实例化…

【SH】Ubuntu Server 24搭建Web服务器访问Python程序研发笔记

文章目录 说个问题写个方案一、安装Ubuntu Server二、安装Web服务器采用Nginx服务器 三、安装Python及依赖创建项目虚拟环境 四、安装Python Web框架采用Flask框架创建和运行Flask应用&#xff08;以后的重点&#xff09; 五、安装WSGI服务器采用Gunicorn 六、配置Nginx七、验证…

109.【C语言】数据结构之求二叉树的高度

目录 1.知识回顾&#xff1a;高度&#xff08;也称深度&#xff09; 2.分析 设计代码框架 返回左右子树高度较大的那个的写法一:if语句 返回左右子树高度较大的那个的写法二:三目操作符 3.代码 4.反思 问题 出问题的代码 改进后的代码 执行结果 1.知识回顾&#xf…

瑞吉外卖项目学习笔记(二)Swagger、logback、表单校验和参数打印功能的实现

瑞吉外卖项目学习笔记(一)准备工作、员工登录功能实现 文章目录 3 项目组件优化3.1 实现Swagger文档输出3.2 实现logback日志打印3.3 实现表单校验功能3.4 实现请求参数和响应参数的打印 3 项目组件优化 3.1 实现Swagger文档输出 1&#xff09;在application.yml中增加knife4…

OpenEuler 22.03 安装 flink-1.17.2 集群

零&#xff1a;规划 本次计划安装三台OpenEuler 22.03 版本操作系统的服务器&#xff0c;用于搭建 flink 集群。这里使用flink1.17.2 的原因&#xff0c;是便于后续与springboot的整合 服务器名IP地址作用其他应用flink01192.168.159.133主jdk11、flink-1.17.2flink02192.168.…

[数据结构] 链表

目录 1.链表的基本概念 2.链表的实现 -- 节点的构造和链接 节点如何构造? 如何将链表关联起来? 3.链表的方法(功能) 1).display() -- 链表的遍历 2).size() -- 求链表的长度 3).addFirst(int val) -- 头插法 4).addLast(int val) -- 尾插法 5).addIndex -- 在任意位置…

20241220在荣品开发板PRO-RK3566的buildroot下适配gc2093

20241220在荣品开发板PRO-RK3566的buildroot下适配gc2093 2024/12/20 16:00 余顺?PRO-RK3566开发板 挂 gc2093模块。刷 buildroot的预编译固件。 update-pro-rk3566-buildroot-hdmi-20231130-034633.img 1、现在发现 qcamera的 拍照Capture、Record录像模式都是640x480分辨率…

实习冲刺数据库练习-01 基础查询

原题链接&#xff1a;牛客网在线编程_SQL篇_非技术快速入门 数据表示例&#xff1a; 根据数据表示例要求我们完成以下查询&#xff1a; &#xff08;1&#xff09;获取用户信息表中所有的数据&#xff0c;请你取出相应结果 &#xff08;2&#xff09;获取用户的设备id对应的…

【Mars3d】设置backgroundImage、map.scene.skyBox、backgroundImage来回切换

相关链接&#xff1a; http://mars3d.cn/editor-vue.html?keyex_1_2_1&idmap/other/backgroundImg 实现代码&#xff1a; export function show1() {map.setOptions({scene: {backgroundType: "image",backgroundImage: "url(//data.mars3d.cn/img/busin…

telnet命令检查端口

1、简介 telnet是一种用于远程登录的协议&#xff0c;可以通过telnet客户端连接到远程主机&#xff0c;并在远程主机上执行命令。 2、使用telnet命令检查端口 2.1 进入linux终端 2.2 输入telnet命令 如果没有安装telnet命令&#xff0c;请执行以下命令安装 sudo yum install…

Unity 根据文本宽度自动移动图像位置

游戏中有时候需要变动的显示一个物品的数量&#xff0c;变化的文本宽度不停的变化&#xff0c;这时候需要将物品的icon随着文本的长度而改变位置。 实现思路&#xff1a;使用Content Size Fitter来动态改变内容的大小。 首先建立一个文本组件&#xff0c;添加Content Size Fi…

基于Springboot人口老龄化社区服务与管理平台【附源码】

基于Springboot人口老龄化社区服务与管理平台 效果如下&#xff1a; 系统登陆页面 系统主页面 社区信息页面 社区文件页面 活动报名页面 走访任务管理页面 社区资讯页面 老人信息管理页面 研究背景 随着社会老龄化的加剧&#xff0c;老年人口比例逐渐增加&#xff0c;对老年…

加密数据库在现代企业中的应用实践

以下是对加密数据库在现代企业中的应用实践的详细阐述&#xff1a; 一、加密数据库的应用背景 随着信息技术的飞速发展&#xff0c;现代企业对于数据的安全性和隐私保护要求越来越高。数据库作为存储大量敏感信息的关键设施&#xff0c;其安全性直接关系到企业的商业利益和声誉…

安卓环境配置及打开新项目教程,2024年12月20日最新版

1.去官网下载最新的Android Studio&#xff0c;网址&#xff1a;https://developer.android.com/studio?hlzh-cn 2.下载加速器&#xff0c;注册账号&#xff0c;开启加速器。网址&#xff1a;放在文末。 3.下载安卓代码&#xff0c;项目的路径上不能有中文&#xff0c;特别是…

20241217使用M6000显卡在WIN10下跑whisper来识别中英文字幕

20241217使用M6000显卡在WIN10下跑whisper来识别中英文字幕 2024/12/17 17:21 缘起&#xff0c;最近需要识别法国电影《地下铁》的法语字幕&#xff0c;使用 字幕小工具V1.2【whisper套壳/GUI封装了】 无效。 那就是直接使用最原始的whisper来干了。 当你重装WIN10的时候&#…