首页 > 其他分享 >go语言学习-gin框架路由

go语言学习-gin框架路由

时间:2023-04-11 12:02:03浏览次数:29  
标签:http fmt ctx func go gin main 路由

表单参数

表单参数传输为post请求,http常见的传输格式为四种

  • application/json
  • application/x-www-form-urlencoded
  • application/xml
  • multipart/form-data

表单参数可以通过PostForm()方法获取,该方法默认解析的是x-www-form-urlencoded或from-data格式的参数

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <form action="http://localhost:8080/form" method="post" action="application/x-www-form-urlencoded">
        用户名:<input type="text" name="username" placeholder="请输入你的用户名">  <br>
        密   码:<input type="password" name="userpassword" placeholder="请输入你的密码">  <br>
        <input type="submit" value="提交">
    </form>
</body>
</html>

go语言学习-gin框架路由_github

package main

import (
	"fmt"
	"net/http"

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

func main() {
	r := gin.Default()
	r.POST("/form", func(ctx *gin.Context) {
		types := ctx.DefaultPostForm("type", "post")
		username := ctx.PostForm("username")
		password := ctx.PostForm("userpassword")
		ctx.String(http.StatusOK, fmt.Sprintf("username:%s,password:%s,type:%s",
			username, password, types))
	})
	r.Run()
}

go语言学习-gin框架路由_上传_02


上传文件

  • multipart/form-data格式用于文件上传
  • gin文件上传与原生的net/http方法类似,不同在于gin把原生的request封装到c.Request中
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <form action="http://localhost:8080/upload" method="post" enctype="multipart/form-data">
          上传文件:<input type="file" name="file" >
          <input type="submit" value="提交">
    </form>
</body>
</html>
package main

import (
	"net/http"

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

func main() {
	r := gin.Default()
	//限制上传最大尺寸
	r.MaxMultipartMemory = 8 << 20
	r.POST("/upload", func(ctx *gin.Context) {
		file, err := ctx.FormFile("file")
		if err != nil {
			ctx.String(500, "上传图片出错")
		}
		//保存文件
		ctx.SaveUploadedFile(file, file.Filename)
		//返回输出消息
		ctx.String(http.StatusOK, file.Filename)
	})
	r.Run()
}


go语言学习-gin框架路由_html_03


限制上传指定文件大小以及文件类型

package main

import (
    "fmt"
    "log"
    "net/http"

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

func main() {
    r := gin.Default()
    r.POST("/upload", func(c *gin.Context) {
        _, headers, err := c.Request.FormFile("file")
        if err != nil {
            log.Printf("Error when try to get file: %v", err)
        }
        //headers.Size 获取文件大小
        if headers.Size > 1024*1024*2 {
            fmt.Println("文件太大了")
            return
        }
        //headers.Header.Get("Content-Type")获取上传文件的类型
        if headers.Header.Get("Content-Type") != "image/png" {
            fmt.Println("只允许上传png图片")
            return
        }
        c.SaveUploadedFile(headers, "./video/"+headers.Filename)
        c.String(http.StatusOK, headers.Filename)
    })
    r.Run()
}

上传多个文件

package main

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

// gin的helloWorld

func main() {
   // 1.创建路由
   // 默认使用了2个中间件Logger(), Recovery()
   r := gin.Default()
   // 限制表单上传大小 8MB,默认为32MB
   r.MaxMultipartMemory = 8 << 20
   r.POST("/upload", func(c *gin.Context) {
      form, err := c.MultipartForm()
      if err != nil {
         c.String(http.StatusBadRequest, fmt.Sprintf("get err %s", err.Error()))
      }
      // 获取所有图片
      files := form.File["files"]
      // 遍历所有图片
      for _, file := range files {
         // 逐个存
         if err := c.SaveUploadedFile(file, file.Filename); err != nil {
            c.String(http.StatusBadRequest, fmt.Sprintf("upload err %s", err.Error()))
            return
         }
      }
      c.String(200, fmt.Sprintf("upload ok %d files", len(files)))
   })
   //默认端口号是8080
   r.Run(":8000")
}

路由组

routes group是为了管理一些相同的URL

package main

import (
	"fmt"

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

func login(ctx *gin.Context) {
	name := ctx.DefaultQuery("name", "yangchao")
	ctx.String(200, fmt.Sprintf("hello %s\n", name))

}

func submit(ctx *gin.Context) {
	name := ctx.DefaultQuery("name", "hcie")
	ctx.String(200, fmt.Sprintf("hello %s\n", name))

}

func main() {
	//创建路由
	//默认使用了2个中间件Logger(),Recovery()
	r := gin.Default()
	//路由组1处理get请求
	v1 := r.Group("/v1")
	//{}是书写规范
	{
		v1.GET("/login", login)
		v1.GET("/submit", submit)
	}
	v2 := r.Group("/v2")
	{
		v2.POST("/login", login)
		v2.POST("/submit", submit)
	}
	r.Run()
}

测试

go语言学习-gin框架路由_上传_04

go语言学习-gin框架路由_上传_05

go语言学习-gin框架路由_上传_06

实现404页面


package main

import (
	"fmt"
	"net/http"

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

func main() {
	r := gin.Default()
	r.GET("/user", func(ctx *gin.Context) {
		//指定默认值
		name := ctx.DefaultQuery("name", "yangchao")
		ctx.String(http.StatusOK, fmt.Sprintf("hello %s", name))
	})
	//指定404
	r.NoRoute(func(ctx *gin.Context) {
		ctx.String(http.StatusNotFound, "404 no found 1123131")
	})
	r.Run()

}



go语言学习-gin框架路由_上传_07


go语言学习-gin框架路由_github_08


标签:http,fmt,ctx,func,go,gin,main,路由
From: https://blog.51cto.com/u_11555417/6182970

相关文章

  • .NET Core MongoDB数据仓储和工作单元模式实操
    前言MongoDB从入门到实战的相关教程YyFlight.ToDoList项目源码地址MongoDB事务使用前提说明创建EntityBase公共类添加UserInfo用户表实体映射模型创建用户Repository创建用户管理业务代码UserOperationExample控制创建注册数据库基础操作和工作单元注册相关应用服务......
  • Nginx 通过 Cookie 做灰度就这么简单
    由于业务需要,要做灰度发布测试,刚开始考虑通过IP来做判断,分发不同的后端,但是由于IP不好确定,有的客户端IP不固定,所以考虑用cookie来做逻辑很简单,如下图:  在nginx做这个很简单,两个方法,map或if首先看map怎么做为了模拟环境,我又不想多开服务器,所以起了个http......
  • 巧用Nginx配置解决跨域问题
    页面nginx配置1,前端页面放在域名根目录,比如,http://www.xuecheng.com/,对应的nginx配置:#门户location/{aliasD:/Z_lhy/SpringCloud/xuecheng_online/www/xc-ui-pc-static-portal/;indexindex.html;}页面目录:接口nginx配......
  • Django 同一Model注册多个modelAdmin
    需求:同一个djangomodel模型,根据不同需求展示注册到admin.py中classUserMsg(models.Model):username=models.CharField(max_length=20,null=False,verbose_name='发送方')hername=models.CharField(max_length=20,null=True,verbose_name='对方姓名')ti......
  • Go笔记(二):条件控制语句
    Go语言中的if语句根据条件表达式的结果选择需要执行的业务流程。1、if控制语句1、if语法语法详情如下:if条件表达式{//条件表达式为true,执行的代码块}条件表达式必须返回布尔型的结果,与Java语法不同,在Go中,if的条件表达式不使用括号。2、if/else语法......
  • golang中的错误处理
    0.1、索引https://waterflow.link/articles/16667167272361、panic当我们执行panic的时候会结束下面的流程:packagemainimport"fmt"funcmain(){ fmt.Println("hello") panic("stop") fmt.Println("world")}gorun9.gohellopanic:s......
  • 如何用Golang处理每分钟100万个请求
    用Golang处理每分钟100万个请求转载请注明来源:https://janrs.com/9yaq面临的问题在我设计一个分析系统中,我们公司的目标是能够处理来自数百万个端点的大量POST请求。web网络处理程序将收到一个JSON文档,其中可能包含许多有效载荷的集合,需要写入AmazonS3,以便我们的地图还原......
  • Python Django 通用视图和错误视图的使用
    定义通用视图修改book/models.py代码中的AuthorInfo类,如果一致则不必修改classAuthorInfo(models.Model):id=models.CharField(max_length=30,verbose_name="身份证号",primary_key=True)name=models.CharField(max_length=20,verbose_name="姓名")t......
  • go语言学习-gin框架学习笔记-1
    gin是一个golang的微框架,封装比较优雅,api友好,源码注释比较明确,具有快速灵活,容错方便等特点,对于golang而言,web框架的依赖远要比python,java之类的要小,自身的net/http足够简单,性能也非常不错。安装goget-ugithub.com/gin-gonic/gin//安装import"github.com/gin-goinc/gin"//......
  • Linux环境下nginx安装详细教程,一步步装上nginx
    本人安装Nginx环境为:CentOS7.9 下载安装包下载Nginx安装包Linux版:Nginx官网下载:https://nginx.org/en/download.html下载Stableversion(即稳定版) 上传安装包将压缩包放入系统: 解压:tar-zxvfnginx-1.22.1.tar.gz解压成功: 编译安装执行./configure配置命令:这里提示./config......