Redian新闻
>
gin框架路由讲解

gin框架路由讲解

公众号新闻

表单参数

表单参数传输为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>

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()}

上传文件

  • 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()}

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

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()}

测试



实现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()
}


链接:https://blog.51cto.com/u_11555417/6182970

(版权归原作者所有,侵删)



微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
南京高校上演“春宫图”详细讲解引爆舆论:这件事,你可能真不懂Istio可观测性讲解【24年全新考纲】CFA线上题库,每道题目都有视频讲解!奥斯丁芯片代工老厂(2)-辛勤的南郭先生和骗子客户的故事图神经网络(GNN)经典论文与代码讲解课程!TP-LINK BE3600/5100/6500 Wi-Fi 7 路由器现已开售,229 元起Keras 3.0正式发布!一统TF/PyTorch/Jax三大后端框架,网友:改变游戏规则NeurIPS 2023 | 模仿人类举一反三,数据集扩增新范式GIF框架来了华为向Wi-Fi 7时代开出“第一枪” 将给路由器市场带来怎样的连锁效应?暑期“中国古都行夏令营”1月19日线上讲解,别错过,当天报名有优惠哦!!基于大语言模型LangChain框架:知识库问答系统实践|文末赠书CVPR 2023 | MovieChat: 集成视觉模型和LLM的长视频理解新型框架最佳实践|一文讲解端线程死循环的治理改进分子表征学习,清华团队提出知识引导的图 Transformer 预训练框架张洁,读过点视觉模型+大语言模型:首个支持10K+帧长视频理解任务的新型框架RecSys 2023最佳短文奖:推荐系统中的可解释用户留存优化框架谷歌发布Prompt Expansion框架,让文生图更轻松!2024年度卫生资格考试现场确认【所需材料】和【审核时间】详细讲解!明日直播|BAT资深数据分析师为你讲解2024数据求职如何成功上岸!硬核观察 #1246 OpenWrt 项目准备推出开放路由器新职位 | 北京馆 · 讲解员岗位,急招!叶嘉莹讲解,这套书让你读懂苏东坡!中山大学开源VeryFL:基于区块链的联邦学习实验框架百年无痕 1.14里乔托·卡努杜:搭建电影美学理论的最初框架系统讲解甲骨文的识字绘本,中央美院团队3年打造,趣味硬核汉字启蒙尕妹子与嘎小子华为首款 Wi-Fi 7 路由器 BE3 Pro 上市,1000M 网口版 399 元【最新】内环高架路杨浦段夜景照明换新装,一带四区打造特色夜间景观!长篇小说《谷雨立夏间》36 天下乌鸦Go操作数据库与Gorm讲解NeurIPS 2023 | AI Agents先行者CAMEL:首个基于大模型的多智能体框架大学课堂讲解春宫图?校方回应日薪800, 双语讲解兼职
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。