“绍兴”e《网租》房:Gin框架系列02:路由与参数

admin 2个月前 (04-09) 科技 6 0

【回首】

上一节我们用Gin 框架快速搭建了[一个GET请求的接口,今天来学习路由和参数的获取。

‘请求动词’

熟悉[RESTful『的同砚应该知道』,RESTful是网络应用程序的一种设计气概和开发方式,每一个URI代表一种资源,【客户端通过】POSTDELETEPUTGET(四种请求方式来对资源做增删改查)的操作。

同样的,Gin框架给我们提供的除这4『种动词外』,『另有』PATCHOPTIONHEAD等,『详细内容可以查看』rentergroup.go【文件的】IRoutes接口。

type IRoutes interface {
	Use(...HandlerFunc) IRoutes

	Handle(string, string, ...HandlerFunc) IRoutes
	Any(string, ...HandlerFunc) IRoutes
	GET(string, ...HandlerFunc) IRoutes
	POST(string, ...HandlerFunc) IRoutes
	DELETE(string, ...HandlerFunc) IRoutes
	PATCH(string, ...HandlerFunc) IRoutes
	PUT(string, ...HandlerFunc) IRoutes
	OPTIONS(string, ...HandlerFunc) IRoutes
	HEAD(string, ...HandlerFunc) IRoutes

	StaticFile(string, string) IRoutes
	Static(string, string) IRoutes
	StaticFS(string, http.FileSystem) IRoutes
}

“由于”RenterGroup〖实现了〗IRoutes界说的所有‘请求动词’,‘而且’gin.Default返回的Engine{类型继续了}RenterGroup,{以是使用起来异常简朴},“只需要通过”gin.Default(实例化)工具,接下来所有的路由操作都通过该工具使用即可。

func main() {
	router := gin.Default()
	router.POST("/article", func(c *gin.Context) {
		c.String(200, "article post")
	})
	router.DELETE("/article", func(c *gin.Context) {
		c.String(200, "article delete")
	})
	router.PUT("/article", func(c *gin.Context) {
		c.String(200, "article put")
	})
	router.GET("/article", func(c *gin.Context) {
		c.String(200, "article get")
	})
	router.Run()
}

‘请求动词’的第一个参数是请求路径,第二个参数是用于逻辑处置的函数,{可以是匿名的}{或}是其他地方界说的函数名。差别的‘请求动词’可以界说「相同」的路径,(只需要切换动词就可以进入对应的处置逻辑)。

curl -X PUT http://localhost:8080/article
curl -X POST http://localhost:8080/article
curl -X GET http://localhost:8080/article
curl -X DELETE http://localhost:8080/article

路由参数

GET请求有两种,一种是在URL后加上?name=pingye,〖这种是有参数名的〗,{另一种是在路径中直接加上参数值}/article/1,这种没有参数名,「需要在代码中剖析参数」。

protocol://hostname:[port]/path/[query]#fragment

我们先来看路由携带参数值的玩法,「这」里有一道题,怎么行使Gin获取下面链接的参数值1

实现方式异常简朴,《只需要在路由中设置好占位符》:id,冒号为占位符的标志,冒号后面的参数名可以自界说,Gin“会将路由与请求地址举行匹配”,<若匹>配乐成会将1赋值为占位符:id,只需挪用c.Param《就可以获取》id『的值』。

router.GET("/article/:id", func(c *gin.Context) {
  id := c.Param("id")
  c.String(200, id)
})

然则,:id占位符会存在一个问题,(若是)id〖参数值传空就会有〗404的错误提醒。

“于是”Gin{提供了}另一种占位符*id,『使用它就可以到达取空值的目』的。

router.GET("/article/*id", func(c *gin.Context) {
  id := c.Param("id")
  c.String(200, id)
})

通俗参数

“除了路由携带”参数值外,{接下来看对照传统的}GET“传参方式”。

http://localhost:8080/welcome?firstname=Jane&lastname=Doe

〖可以〗通过c.Query{或}c.DefaultQuery方式获取问号后的参数。

router.GET("/welcome", func(c *gin.Context) {
   firstname := c.DefaultQuery("firstname", "pingyeaa")
   lastname := c.Query("lastname")
   c.String(200, firstname+" "+lastname)
})

《这两者最终都挪用了》GetQuery方式,『唯一的区别是』DefaultQuery做了默认值处置。

func (c *Context) DefaultQuery(key, defaultValue string) string {
	if value, ok := c.GetQuery(key); ok {
		return value
	}
	return defaultValue
}

func (c *Context) Query(key string) string {
	value, _ := c.GetQuery(key)
	return value
}

“表单参数”

‘从’HTML提交过来的表单form内容同样也可以轻松获取。

router.POST("/form_post", func(c *gin.Context) {
  message := c.PostForm("message")
  nick := c.DefaultPostForm("nick", "anonymous")

  c.JSON(200, gin.H{
    "status":  "posted",
    "message": message,
    "nick":    nick,
  })
})
curl -d "message=pingye" http://localhost:8080/form_post
{"message":"pingye","nick":"anonymous","status":"posted"}

数组类型参数[

【有时候】(例如复选框)前端页面会传来数组类型『的值』,这种类型name「相同」,但存储的内容差别。

POST /post?ids[a]=1234&ids[b]=hello HTTP/1.1
Content-Type: application/x-www-form-urlencoded

依然是一个QueryMap{方式就搞定},<该方式默认返回>map类型。

router.GET("/post", func(c *gin.Context) {
  ids := c.QueryMap("ids")
  c.String(200, ids["a"]+" "+ids["b"])
})
curl http://localhost:8080/post?ids[a]=pingye&ids[b]=hehe
pingye hehe

【文件上传】

『一样平常情形下』,【文件上传】会由前端直接传给云存储服务商,好比阿里云、七牛云等,对照少的场景会传给自己的服务器。〖为了制止〗【书到用时方恨少】的情形发生,我们来领会一下。

Gin{提供了}FormFile【方式获取文件流】, 这个方式返回了一个[FileHeader{类型}的变量,可以挪用Filename{属性来查看文件名}。

type FileHeader struct {
   Filename string
   Header   textproto.MIMEHeader
   Size     int64

   content []byte
   tmpfile string
}
router.POST("/upload", func(c *gin.Context) {
  file, _ := c.FormFile("file")
  c.String(200, file.Filename)
})

通过curl请求接口,可以看到轻松获取文件名称。

curl -X POST http://localhost:8080/upload \
  -F "file=@/Users/enoch/Downloads/IMG_9216.JPG" \
  -H "Content-Type: multipart/form-data"
IMG_9216.JPG

“固然不止可以拿到文件名”,《我们还可以使用》SaveUploadedFile方式将文件保留到某个地方,<文件保留时要确保有目的目录的操作权限>。

router.POST("/upload", func(c *gin.Context) {
		file, _ := c.FormFile("file")
		c.String(200, file.Filename)
		err := c.SaveUploadedFile(file, "/Users/enoch/Desktop/ab.png")
		if err != nil {
			c.String(500, err.Error())
		}
})

〖路由分组〗

当接口发生重大调换(‘好比入参出参’)时, 考虑到向下[兼容,一样平常会新增一个接口,然则又希望新接口的名称显而易见地看出是老接口的升级版,「那么就可以在接口名前加上版本」号v1/article『这种形式』。

v1 := r.Group("v1")
{
  v1.POST("/login", func(c *gin.Context) {
    c.String(200, "v1/login")
  })
  v1.POST("/submit", func(c *gin.Context) {
    c.String(200, "v1/submit")
  })
}

v2 := r.Group("v2")
{
  v2.POST("/login", func(c *gin.Context) {
    c.String(200, "v2/login")
  })
  v2.POST("/submit", func(c *gin.Context) {
    c.String(200, "v2/submit")
  })
}
curl -X POST http://localhost:8080/v1/login
curl -X POST http://localhost:8080/v2/login

Go语言库代码示例,迎接star
https://github.com/pingyeaa/golang-examples

“谢谢人人的旁观”,(若是)以为文章对你有所辅助,{迎接关注民众号}「<平也>」,『聚焦』Go语言与手艺原理。
Sunbet,进入申博Sunbet官网  第1张

,

阳光在线手机版

阳光在线(“原诚信在线官网”)现已开放阳光在线手机版、(阳光在线电)脑客户端下载。阳光在线娱乐戏公平、<公开>、公正,用实力赢取信誉。

申博声明:该文看法仅代表作者自己,与本平台无关。转载请注明:“绍兴”e《网租》房:Gin框架系列02:路由与参数

网友评论

  • (*)

最新评论

站点信息

  • 文章总数:957
  • 页面总数:0
  • 分类总数:8
  • 标签总数:2085
  • 评论总数:58
  • 浏览总数:8995