go之web框架gin

news2024/12/23 10:16:50

介绍

Gin 是一个用 Go (Golang) 编写的 Web 框架。 它具有类似 martini 的 API,性能要好得多,多亏了 httprouter,速度提高了 40 倍。 如果您需要性能和良好的生产力,您一定会喜欢 Gin。

安装

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

快速开始

package main

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

func main() {
	r := gin.Default()
	r.GET("/ping", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "pong",
		})
	})
	r.Run() // 监听并在 0.0.0.0:8080 上启动服务
}

接受请求参数

公共部分

package main

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

func main() {
	router := gin.Default()
	 //调用方法
	router.Run(":8080")
}

get请求

获取路径上数据(post一样)

使用gin.Context.Query("参数名")获取

func main() {
	router := gin.Default()
	testGetUrl(router)
	router.Run(":8080")
}
func testGetUrl(router *gin.Engine) {
	router.GET("/getUrl", func(c *gin.Context) {
		// 获取参数值
		name := c.Query("name")
		age := c.Query("age")
		// 返回响应
		c.JSON(http.StatusOK, gin.H{
			"name": name,
			"age":  age,
		})
	})
}

获取路由参数(post一样)

package main

import (
	"github.com/gin-gonic/gin"
	"io"
	"net/http"
	"net/url"
	"os"
)

func main() {
	router := gin.Default()
	testRouteParams(router)
	router.Run(":8080")
}
func testRouteParams(router *gin.Engine) {
	router.GET("/routeParams/:name/:age", func(c *gin.Context) {
		// 获取参数值
		name := c.Param("name")
		age := c.Param("age")
		// 返回响应
		c.JSON(http.StatusOK, gin.H{
			"name": name,
			"age":  age,
		})
	})
}

获取cookie(post一样)

package main

import (
	"github.com/gin-gonic/gin"
	"io"
	"net/http"
	"net/url"
	"os"
)

func main() {
	router := gin.Default()
	testCookies(router)
	router.Run(":8080")
}
func testCookies(router *gin.Engine) {
	router.GET("/cookies", func(c *gin.Context) {
		// 获取参数值
		name, _ := c.Cookie("name")
		age, _ := c.Cookie("age")
		// 返回响应
		c.JSON(http.StatusOK, gin.H{
			"name": name,
			"age":  age,
		})
	})
}

 

获取表单参数(post一样)

func main() {
	router := gin.Default()
	testGetForm(router)
	router.Run(":8080")
}
func testGetForm(router *gin.Engine) {
	router.GET("/getForm", func(c *gin.Context) {
		var form User
		// 在这种情况下,将自动选择合适的绑定
		if c.ShouldBind(&form) == nil {
			// 返回响应
			c.JSON(http.StatusOK, gin.H{
				"name": form.Name,
				"age":  form.Age,
			})
		}

	})
}

获取请求头(post一样)

func main() {
	router := gin.Default()
	testGetHeader(router)
	router.Run(":8080")
}
func testGetHeader(router *gin.Engine) {
	router.GET("/getHeader", func(c *gin.Context) {
		// 获取参数值
		name := c.GetHeader("name")
		age := c.GetHeader("age")
		contentType := c.GetHeader("Content-Type")
		// 返回响应
		c.JSON(http.StatusOK, gin.H{
			"name":        name,
			"age":         age,
			"contentType": contentType,
		})
	})
}

 

post请求

获取请求体数据

和post表单一样 

func main() {
	router := gin.Default()
	testPostForm(router)
	router.Run(":8080")
}
func testPostForm(router *gin.Engine) {
	router.POST("/postForm", func(c *gin.Context) {
		var form User
		// 在这种情况下,将自动选择合适的绑定
		if c.ShouldBind(&form) == nil {
			// 返回响应
			c.JSON(http.StatusOK, gin.H{
				"name": form.Name,
				"age":  form.Age,
			})
		}

	})
}

 文件上传下载

上传单个文件

package main

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

func main() {
	router := gin.Default()
	testUpload(router)
	router.Run(":8080")
}
func testUpload(router *gin.Engine) {
	// 为 multipart forms 设置较低的内存限制 (默认是 32 MiB)
	router.MaxMultipartMemory = 8 << 20 // 8 MiB
	router.POST("/upload", func(c *gin.Context) {
		// 单文件
		file, _ := c.FormFile("file")
		dst := file.Filename
		// 上传文件至指定的完整文件路径
		c.SaveUploadedFile(file, dst)
		// 返回响应
		c.JSON(http.StatusOK, gin.H{
			"name": file.Filename,
		})
	})
}

 

上传多个文件

package main

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

func main() {
	router := gin.Default()
	testUploadMany(router)
	router.Run(":8080")
}
func testUploadMany(router *gin.Engine) {
	// 为 multipart forms 设置较低的内存限制 (默认是 32 MiB)
	router.MaxMultipartMemory = 8 << 20 // 8 MiB
	router.POST("/uploadMany", func(c *gin.Context) {
		// Multipart form
		form, _ := c.MultipartForm()
		fileNames := make([]string, 0)
		files := form.File["fileList"]
		for _, file := range files {
			// 上传文件至指定目录
			c.SaveUploadedFile(file, "filedir/"+file.Filename)
			fileNames = append(fileNames, file.Filename)
		}
		// 返回响应
		c.JSON(http.StatusOK, gin.H{
			"name": fileNames,
		})
	})
}

 

 

下载文件 

package main

import (
	"github.com/gin-gonic/gin"
	"io"
	"net/http"
	"net/url"
	"os"
)

func main() {
	router := gin.Default()
	testDownload(router)
	router.Run(":8080")
}
func testDownload(router *gin.Engine) {
	router.POST("/download", func(c *gin.Context) {
		// 获取文件路径
		targetFileName := "照片1.png"
		filePath := "filedir/" + targetFileName
		// 检查文件是否存在
		_, err := os.Stat(filePath)
		if os.IsNotExist(err) {
			c.String(http.StatusNotFound, "File not found")
			return
		}
		//中文名称会乱码,导致下载失败,所以需要编码
		name := url.QueryEscape(targetFileName)
		// 设置响应头,指定文件名和内容类型
		c.Header("Content-Disposition", "attachment; filename="+name)
		c.Header("Content-Type", "application/octet-stream")
		// 打开文件
		file, err := os.Open(filePath)
		if err != nil {
			c.String(http.StatusInternalServerError, "Error opening file")
			return
		}
		defer file.Close()
		// 将文件内容写入响应体
		_, err = io.Copy(c.Writer, file)
		if err != nil {
			c.String(http.StatusInternalServerError, "Error copying file")
			return
		}
	})
}

由于是postman下载的,没法解析为中文,用浏览器下载就没问题了

日志

func main() {
    // 禁用控制台颜色,将日志写入文件时不需要控制台颜色。
    gin.DisableConsoleColor()

    // 记录到文件。
    f, _ := os.Create("gin.log")
    gin.DefaultWriter = io.MultiWriter(f)

    // 如果需要同时将日志写入文件和控制台,请使用以下代码。
    // gin.DefaultWriter = io.MultiWriter(f, os.Stdout)

    router := gin.Default()
    router.GET("/ping", func(c *gin.Context) {
        c.String(200, "pong")
    })

    router.Run(":8080")
}

路由组

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

	// 简单的路由组: v1
	v1 := router.Group("/v1")
	{
		v1.POST("/login", loginEndpoint)
		v1.POST("/submit", submitEndpoint)
		v1.POST("/read", readEndpoint)
	}

	// 简单的路由组: v2
	v2 := router.Group("/v2")
	{
		v2.POST("/login", loginEndpoint)
		v2.POST("/submit", submitEndpoint)
		v2.POST("/read", readEndpoint)
	}

	router.Run(":8080")
}

运行多个服务

package main

import (
	"log"
	"net/http"
	"time"

	"github.com/gin-gonic/gin"
	"golang.org/x/sync/errgroup"
)

var (
	g errgroup.Group
)

func router01() http.Handler {
	e := gin.New()
	e.Use(gin.Recovery())
	e.GET("/", func(c *gin.Context) {
		c.JSON(
			http.StatusOK,
			gin.H{
				"code":  http.StatusOK,
				"error": "Welcome server 01",
			},
		)
	})

	return e
}

func router02() http.Handler {
	e := gin.New()
	e.Use(gin.Recovery())
	e.GET("/", func(c *gin.Context) {
		c.JSON(
			http.StatusOK,
			gin.H{
				"code":  http.StatusOK,
				"error": "Welcome server 02",
			},
		)
	})

	return e
}

func main() {
	server01 := &http.Server{
		Addr:         ":8080",
		Handler:      router01(),
		ReadTimeout:  5 * time.Second,
		WriteTimeout: 10 * time.Second,
	}

	server02 := &http.Server{
		Addr:         ":8081",
		Handler:      router02(),
		ReadTimeout:  5 * time.Second,
		WriteTimeout: 10 * time.Second,
	}

	g.Go(func() error {
		return server01.ListenAndServe()
	})

	g.Go(func() error {
		return server02.ListenAndServe()
	})

	if err := g.Wait(); err != nil {
		log.Fatal(err)
	}
}

重定向

HTTP 重定向很容易。 内部、外部重定向均支持。

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

通过 POST 方法进行 HTTP 重定向。请参考 issue:#444

r.POST("/test", func(c *gin.Context) {
	c.Redirect(http.StatusFound, "/foo")
})

路由重定向,使用 HandleContext

r.GET("/test", func(c *gin.Context) {
    c.Request.URL.Path = "/test2"
    r.HandleContext(c)
})
r.GET("/test2", func(c *gin.Context) {
    c.JSON(200, gin.H{"hello": "world"})
})

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

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

相关文章

XRDP登录ubuntu桌面闪退问题

修改 /etc/xrdp/startwm.sh unset DBUS_SESSION_BUS_ADDRESS unset XDG_RUNTIME_DIR . $HOME/.profile

【C语言】——指针七:数组和指针试题解析

【C语言】——指针七&#xff1a; 前言一、 s i z e o f sizeof sizeof 与 s t r l e n strlen strlen 的对比1.1、 s i z e o f sizeof sizeof1.2、 s t r l e n strlen strlen1.3、 s i z e o f sizeof sizeof 和 s t r l e n strlen strlen 对比 二、数组和指针笔试题解析…

C++之优化Linux内核结构体用智能指针std::unique_ptr与std::make_unique分配内存总结(二百六十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

自贡市第一人民医院:超融合与 SKS 承载 HIS 等核心业务应用,加速国产化与云原生转型

自贡市第一人民医院始建于 1908 年&#xff0c;现已发展成为集医疗、科研、教学、预防、公共卫生应急处置为一体的三级甲等综合公立医院。医院建有“全国综合医院中医药工作示范单位”等 8 个国家级基地&#xff0c;建成高级卒中中心、胸痛中心等 6 个国家级中心。医院日门诊量…

Linux (Ubuntu)- mysql8 部署

1.基本部署 01》》先查看OS类型&#xff0c;如果是Ubuntu在往下边看 rootspray:/etc/mysql/mysql.conf.d# lsb_release -a LSB Version: core-11.1.0ubuntu2-noarch:security-11.1.0ubuntu2-noarch Distributor ID: Ubuntu Description: Ubuntu 20.04.6 LTS Release: …

Movavi Video Converter 2022 for Mac/Win:卓越的视频音频文件转换器

在数字化时代&#xff0c;视频和音频文件已成为我们日常生活和工作中不可或缺的一部分。无论是制作精美的家庭影片&#xff0c;还是编辑专业的商业视频&#xff0c;一款高效、便捷的视频音频文件转换器无疑是您的得力助手。而Movavi Video Converter 2022&#xff0c;就是这样一…

GPT 模型解析:ChatGPT 如何在语言处理领域引领潮流?

人工智能时代来临 我们正处于AI的iPhone时刻。——黄仁勋&#xff08;英伟达CEO&#xff09; ChatGPT 好得有点可怕了&#xff0c;我们距离危险的强人工智能不远了。——马斯克&#xff08;Tesla/SpaceX/Twitter CEO&#xff09; 以上的内容说明我们现在正处于一个技术大翻牌的…

测斜仪在边坡安全监测中的重要作用

边坡作为土木工程和地质工程领域中常见的结构形式&#xff0c;其稳定性直接关系到工程安全以及人民生命财产的安全。因此&#xff0c;对边坡进行精确、及时的监测是至关重要的。在众多边坡监测仪器中&#xff0c;测斜仪以其独特的优势在边坡安全监测中发挥着重要的作用。 测斜仪…

(24年4月2日更新)Linux安装chrome及chromedriver(Ubuntu20.0416.04)

一、安装Chrome 1&#xff09;先执行命令下载chrome&#xff1a; wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb2&#xff09;安装chrome sudo dpkg -i google-chrome-stable_current_amd64.deb踩坑&#xff1a;这里会提示如下报错&…

C刊级 | Matlab实现GWO-BiTCN-BiGRU-Attention灰狼算法优化双向时间卷积双向门控循环单元融合注意力机制多变量回归预测

C刊级 | Matlab实现GWO-BiTCN-BiGRU-Attention灰狼算法优化双向时间卷积双向门控循环单元融合注意力机制多变量回归预测 目录 C刊级 | Matlab实现GWO-BiTCN-BiGRU-Attention灰狼算法优化双向时间卷积双向门控循环单元融合注意力机制多变量回归预测效果一览基本介绍程序设计参考…

大数据实验一,Hadoop安装及使用

目录 一&#xff0e;实验内容 二&#xff0e;实验目的 三&#xff0e;实验过程截图及说明 1、安装SSH&#xff0c;并配置SSH无密码登录 2、配置java环境 3.Hadoop的安装与配置 4、修改四个配置文件&#xff1a; 5、格式化HDFS的NameNode&#xff1a; 6、启动Hadoop 7、…

springcloud基本使用五(Gateway服务网关)

为什么使用网关&#xff1f; 权限控制&#xff1a;网关作为微服务入口&#xff0c;需要校验用户是是否有请求资格&#xff0c;如果没有则进行拦截。 路由和负载均衡&#xff1a;一切请求都必须先经过gateway&#xff0c;但网关不处理业务&#xff0c;而是根据某种规则&#xff…

[NSSRound#8 Basic]MyPage

[NSSRound#8 Basic]MyPage 打开页面后什么都没有 尝试使用php伪协议 //读取文件源码 filephp://filter/readconvert.base64-encode/resourceindex.php 显示&#xff1a;空白一片 filephp://filter/readconvert.base64-encode/resource/var/www/html/index.php 显示&#xff1…

C#.手术麻醉系统源码 手麻系统如何与医院信息系统进行集成?

C#.手术麻醉系统源码 手麻系统如何与医院信息系统进行集成&#xff1f; 手术麻醉系统与医院信息系统的集成是一个关键步骤&#xff0c;它有助于实现信息的共享和流程的协同&#xff0c;从而提高医疗服务的效率和质量。手麻系统与lis、his、pacs等系统的对接是医院信息化建设的重…

00150金融理论与实务考试分析

1.考试时间及题型 2.历年真题分析—单选题 3.历年真题分析—多选题

Redis windows设置自动开启服务

查看服务 WinR后输入services.msc进入到服务管理页面&#xff0c;查看是否存在Redis服务。 Windows版Redis解压后&#xff0c;是不会在服务中显示的&#xff0c;需要手动配置后才能在服务中看到 配置服务 在解压的Redis版本目录下&#xff0c;输入CMD&#xff0c;运行命…

使用阿里云试用Elasticsearch学习:1.1 基础入门——入门实践

阿里云试用一个月&#xff1a;https://help.aliyun.com/search/?kelastic&sceneall&page1 官网试用十五天&#xff1a;https://www.elastic.co/cn/cloud/cloud-trial-overview Elasticsearch中文文档&#xff1a;https://www.elastic.co/guide/cn/elasticsearch/guide…

Python PDF页面设置 -- 旋转页面、调整页面顺序

在将纸质文档扫描成PDF电子文档时&#xff0c;有时可能会出现页面方向翻转或者页面顺序混乱的情况。为了确保更好地浏览和查看PDF文件&#xff0c;本文将分享一个使用Python来旋转PDF页面或者调整PDF页面顺序的解决方案。 目录 使用Python旋转PDF页面 使用Python调整PDF页面…

RISC-V GNU Toolchain 工具链安装问题解决(含 stdio.h 问题解决)

我的安装过程主要参照 riscv-collab/riscv-gnu-toolchain 的官方 Readme 和这位佬的博客&#xff1a;RSIC-V工具链介绍及其安装教程 - 风正豪 &#xff08;大佬的博客写的非常详细&#xff0c;唯一不足就是 sudo make linux -jxx 是全部小写。&#xff09; 工具链前前后后我装了…

Docker、Kubernetes之间的区别

比较容器化工具&#xff1a;了解 Docker、Kubernetes 在应用程序部署和管理方面的差异。 基本概述 Docker 是一个流行的容器化平台&#xff0c;允许开发人员在容器中创建、部署和运行应用程序。 Docker 提供了一组工具和 API&#xff0c;使开发人员能够构建和管理容器化应用程…