0


golang,gin框架的请求参数(一)--推荐

golang,gin框架的请求参数(一)

gin框架的重要性不过多的强调,重点就gin使用中的参数传递,获取进行梳理文件,满足使用需求。

获取前端请求参数的几种方法:

一、获取参数【浏览器地址获取参数】

1.浏览器地址栏获取参数

1.获取 URL (query)参数

例如:/user/search?username=zhangsan&address=北京。 获取请求的query参数的方法如下:
URL 参数可以通过DefaultQuery() 和 Query() 两个参数获取

这两个【DefaultQuery() 和 Query() 】的区别就是,DefaultQuery()可以放个默认参数,如果没有存参数那么就是使用默认参数,

Query()如果不给参数,就是默认为“”

示例:

1.1后端代码:
  1. package main
  2. import (
  3. "github.com/gin-gonic/gin"
  4. "net/http"
  5. )
  6. // /user/search?username=zhangsan&address=北京
  7. // urlQuery 获取 url中?后面携带的参数
  8. func urlQueryHandle(ctx *gin.Context) {
  9. // 如果指定的key 没有对应的值就使用默认值
  10. username1 := ctx.DefaultQuery("username", "lisi")
  11. // 根据key 获取值
  12. username2 := ctx.Query("username")
  13. address := ctx.Query("address")
  14. // 返回JSON 字符串
  15. ctx.JSON(http.StatusOK, gin.H{
  16. "message": "ok",
  17. "username1": username1,
  18. "username2": username2,
  19. "address": address,
  20. })
  21. }
  22. func main() {
  23. // 创建默认路由
  24. r := gin.Default()
  25. // 绑定路由规则
  26. r.GET("/user/search", urlQueryHandle)
  27. // 监听端口
  28. r.Run(":9000")
  29. }

1.2浏览器访问,从中可以看到我们没有给任何参数,后端Query查询的都是为“”

1.3带参数的访问

  1. http://127.0.0.1:9000/user/search?username=tom&address=xian&username=jerry

?username=tom&address=xian&username=jerry

1.3.1postman获取参数


2.获取参数【获取Path参数(RestFul风格)】

请求的参数通过URL路径传递,例如:/user/search/lisi/北京。 获取请求URL路径中的参数的方式如下。

以下代码是上述两种浏览器获取参数的办法,具体看代码品味下;

  1. package main
  2. import (
  3. "github.com/gin-gonic/gin"
  4. "net/http"
  5. )
  6. // /user/search?username=zhangsan&address=北京
  7. // urlQuery 获取 url中?后面携带的参数
  8. func urlQueryHandle(ctx *gin.Context) {
  9. // 如果指定的key 没有对应的值就使用默认值
  10. username1 := ctx.DefaultQuery("username", "lisi")
  11. // 根据key 获取值
  12. username2 := ctx.Query("username")
  13. address := ctx.Query("address")
  14. // 返回JSON 字符串
  15. ctx.JSON(http.StatusOK, gin.H{
  16. "message": "ok",
  17. "username1": username1,
  18. "username2": username2,
  19. "address": address,
  20. })
  21. }
  22. // /user/search/lisi/北京。 获取请求URL路径中的参数的方式如下
  23. // paramsPathHandle 获取url path中参数
  24. func paramsPathHandle(ctx *gin.Context) {
  25. // 获取参数值
  26. username := ctx.Param("username")
  27. address := ctx.Param("address")
  28. // 数据返回
  29. ctx.JSON(http.StatusOK, gin.H{
  30. "message": "ok",
  31. "username": username,
  32. "address": address,
  33. })
  34. }
  35. func main() {
  36. // 创建默认路由
  37. r := gin.Default()
  38. //两种浏览器地址获取参数的办法
  39. // 绑定路由规则 /user/search?username=zhangsan&address=北京
  40. r.GET("/user/search", urlQueryHandle)
  41. // 2. 绑定路由规则/user/search/lisi/北京。 获取请求URL路径中的参数的方式如下
  42. r.GET("/user/search/:username/:address", paramsPathHandle)
  43. // 监听端口
  44. r.Run(":9000")
  45. }

二、表单获取参数获取 Form参数

表单提交POST请求时,http常见的传输格式有四种application/json (json格式)

  • text/plain (text格式)
  • application/x-www-form-urlencode(表单默认提交格式)
  • application./xml (xml格式)
  • multipart/form-data( 文件上传)

可以通过 DefaultPostForm() 和 PostForm() 两个方法获取(默认解析的是 x-www-form-urlencode 和 form-data 格式的参数)

2.1获取form表单数据

2.1.1application/x-www-form-urlencode(表单默认提交格式)

因为发起post请求,前端只能用postman模拟了

返回结果

2.1.2form-data表单提交方式

2.2获取json参数【**ctx.GetRowData()**】

2.2.1请求数据application./json(json格式)

2.2.2 application./xml (xml格式)

2.3文件上传事项

2.3.1文件上传接收的文件格式要求:

格式是: multipart/form-data

2.3.2多文件上传

2.4表单数据获取的代码

  1. package main
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "github.com/gin-gonic/gin"
  6. "net/http"
  7. )
  8. // /user/search?username=zhangsan&address=北京
  9. // urlQuery 获取 url中?后面携带的参数
  10. func urlQueryHandle(ctx *gin.Context) {
  11. // 如果指定的key 没有对应的值就使用默认值
  12. username1 := ctx.DefaultQuery("username", "lisi")
  13. // 根据key 获取值
  14. username2 := ctx.Query("username")
  15. address := ctx.Query("address")
  16. // 返回JSON 字符串
  17. ctx.JSON(http.StatusOK, gin.H{
  18. "message": "ok",
  19. "username1": username1,
  20. "username2": username2,
  21. "address": address,
  22. })
  23. }
  24. // /user/search/lisi/北京。 获取请求URL路径中的参数的方式如下
  25. // paramsPathHandle 获取url path中参数
  26. func paramsPathHandle(ctx *gin.Context) {
  27. // 获取参数值
  28. username := ctx.Param("username")
  29. address := ctx.Param("address")
  30. // 数据返回
  31. ctx.JSON(http.StatusOK, gin.H{
  32. "message": "ok",
  33. "username": username,
  34. "address": address,
  35. })
  36. }
  37. //=================================
  38. // formParamsHandle 获取form表单提交数据
  39. func formParamsHandle(ctx *gin.Context) {
  40. // 获取不到值时就是用默认值
  41. username1 := ctx.DefaultPostForm("username", "lisi")
  42. username2 := ctx.PostForm("username")
  43. address := ctx.PostForm("address")
  44. // 以Json 字符串的形式返回
  45. ctx.JSON(http.StatusOK, gin.H{
  46. "message": "ok",
  47. "username1": username1,
  48. "username2": username2,
  49. "address": address,
  50. })
  51. }
  52. // json参数
  53. // paramsJsonHandle 获取json字符串相关的参数
  54. func paramsJsonHandle(ctx *gin.Context) {
  55. // 获取request.Body() 中的数据(这里没有进行错误处理)
  56. // 返回的是字节数组
  57. dataBytes, _ := ctx.GetRawData()
  58. // 定义一个map
  59. var m map[string]interface{}
  60. // 反序列化 别忘了&
  61. _ = json.Unmarshal(dataBytes, &m)
  62. // 数据返回
  63. ctx.JSON(http.StatusOK, m)
  64. }
  65. //文件上传
  66. /*
  67. 单个文件上传
  68. 文件上传接收的文件格式是: multipart/form-data
  69. */
  70. // singleFileUploadHandle 当文件上传
  71. func singleFileUploadHandle(ctx *gin.Context) {
  72. // 获取文件
  73. // 根据上传时的参数名获取上传的文件内容 --> 返回对象为 *multipart.FileHeader
  74. fileHeader, err := ctx.FormFile("file")
  75. if err != nil {
  76. ctx.JSON(http.StatusInternalServerError, gin.H{
  77. "message": err.Error(),
  78. })
  79. return
  80. }
  81. // 保存文件内容
  82. // 拼接文件名, 这里直接写死了
  83. targetFileName := fmt.Sprintf("C:/Users/黑熊精/Pictures/%s", fileHeader.Filename)
  84. //targetFileName := fmt.Sprintf("%s", fileHeader.Filename)
  85. // 将文件保存到指定的目录
  86. err = ctx.SaveUploadedFile(fileHeader, targetFileName)
  87. if err != nil {
  88. ctx.JSON(http.StatusInternalServerError, gin.H{
  89. "message": err.Error(),
  90. })
  91. } else {
  92. ctx.JSON(http.StatusOK, gin.H{
  93. "message": fmt.Sprintf("%s upload success!", fileHeader.Filename),
  94. })
  95. }
  96. }
  97. //多文件上传
  98. /**
  99. 多文件上传
  100. */
  101. // multiFileUploadHandle 多文件上传
  102. func multiFileUploadHandle(ctx *gin.Context) {
  103. // form 是一个存储文件信息的结构体
  104. /**
  105. type Form struct {
  106. Value map[string][]string
  107. File map[string][]*FileHeader
  108. */
  109. form, err := ctx.MultipartForm()
  110. if err != nil {
  111. ctx.JSON(http.StatusInternalServerError, gin.H{
  112. "message": err.Error(),
  113. })
  114. return
  115. }
  116. // 获取文件列表,并保存, 返回的是一个切片 []*FileHeader
  117. files := form.File["file"]
  118. for i, file := range files {
  119. targetFileName := fmt.Sprintf("C:/Users/黑熊精/Pictures/%d_%s", i, file.Filename)
  120. err = ctx.SaveUploadedFile(file, targetFileName)
  121. if err != nil {
  122. ctx.JSON(http.StatusInternalServerError, gin.H{
  123. "message": err.Error(),
  124. })
  125. return
  126. }
  127. }
  128. ctx.JSON(http.StatusOK, gin.H{
  129. "message": fmt.Sprintf("upload success!"),
  130. })
  131. }
  132. func main() {
  133. // 创建默认路由
  134. r := gin.Default()
  135. //两种浏览器地址获取参数的办法
  136. // 绑定路由规则 /user/search?username=zhangsan&address=北京
  137. r.GET("/user/search", urlQueryHandle)
  138. // 2. 绑定路由规则/user/search/lisi/北京。 获取请求URL路径中的参数的方式如下
  139. r.GET("/user/search/:username/:address", paramsPathHandle)
  140. //========================表单提交方法======================
  141. // 绑定路由规则
  142. r.POST("/user/search", formParamsHandle)
  143. //json
  144. // 绑定路由规则
  145. r.POST("/user/json", paramsJsonHandle)
  146. //
  147. // 绑定路由规则--文件上传
  148. r.POST("/upload/single", singleFileUploadHandle)
  149. 绑定路由规则--多文件上传
  150. r.POST("/upload/multi", multiFileUploadHandle)
  151. // 监听端口
  152. r.Run(":9000")
  153. }

2.5参数绑定--优化数据方式

使用 ShouldBind() 方法, 根据请求方式,自动提取 JSON, form表单 和 Query 类型的参数,放入结构体中

2.5.1url query参数解析

2.5.2form表单参数解析

2.5.3json 数据解析

三、程序的所有代码

  1. package main
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "github.com/gin-gonic/gin"
  6. "net/http"
  7. )
  8. // /user/search?username=zhangsan&address=北京
  9. // urlQuery 获取 url中?后面携带的参数
  10. func urlQueryHandle(ctx *gin.Context) {
  11. // 如果指定的key 没有对应的值就使用默认值
  12. username1 := ctx.DefaultQuery("username", "lisi")
  13. // 根据key 获取值
  14. username2 := ctx.Query("username")
  15. address := ctx.Query("address")
  16. // 返回JSON 字符串
  17. ctx.JSON(http.StatusOK, gin.H{
  18. "message": "ok",
  19. "username1": username1,
  20. "username2": username2,
  21. "address": address,
  22. })
  23. }
  24. // /user/search/lisi/北京。 获取请求URL路径中的参数的方式如下
  25. // paramsPathHandle 获取url path中参数
  26. func paramsPathHandle(ctx *gin.Context) {
  27. // 获取参数值
  28. username := ctx.Param("username")
  29. address := ctx.Param("address")
  30. // 数据返回
  31. ctx.JSON(http.StatusOK, gin.H{
  32. "message": "ok",
  33. "username": username,
  34. "address": address,
  35. })
  36. }
  37. //=================================
  38. // formParamsHandle 获取form表单提交数据
  39. func formParamsHandle(ctx *gin.Context) {
  40. // 获取不到值时就是用默认值
  41. username1 := ctx.DefaultPostForm("username", "lisi")
  42. username2 := ctx.PostForm("username")
  43. address := ctx.PostForm("address")
  44. // 以Json 字符串的形式返回
  45. ctx.JSON(http.StatusOK, gin.H{
  46. "message": "ok",
  47. "username1": username1,
  48. "username2": username2,
  49. "address": address,
  50. })
  51. }
  52. // json参数
  53. // paramsJsonHandle 获取json字符串相关的参数
  54. func paramsJsonHandle(ctx *gin.Context) {
  55. // 获取request.Body() 中的数据(这里没有进行错误处理)
  56. // 返回的是字节数组
  57. dataBytes, _ := ctx.GetRawData()
  58. // 定义一个map
  59. var m map[string]interface{}
  60. // 反序列化 别忘了&
  61. _ = json.Unmarshal(dataBytes, &m)
  62. // 数据返回
  63. ctx.JSON(http.StatusOK, m)
  64. }
  65. //文件上传
  66. /*
  67. 单个文件上传
  68. 文件上传接收的文件格式是: multipart/form-data
  69. */
  70. // singleFileUploadHandle 当文件上传
  71. func singleFileUploadHandle(ctx *gin.Context) {
  72. // 获取文件
  73. // 根据上传时的参数名获取上传的文件内容 --> 返回对象为 *multipart.FileHeader
  74. fileHeader, err := ctx.FormFile("file")
  75. if err != nil {
  76. ctx.JSON(http.StatusInternalServerError, gin.H{
  77. "message": err.Error(),
  78. })
  79. return
  80. }
  81. // 保存文件内容
  82. // 拼接文件名, 这里直接写死了
  83. targetFileName := fmt.Sprintf("C:/Users/黑熊精/Pictures/%s", fileHeader.Filename)
  84. //targetFileName := fmt.Sprintf("%s", fileHeader.Filename)
  85. // 将文件保存到指定的目录
  86. err = ctx.SaveUploadedFile(fileHeader, targetFileName)
  87. if err != nil {
  88. ctx.JSON(http.StatusInternalServerError, gin.H{
  89. "message": err.Error(),
  90. })
  91. } else {
  92. ctx.JSON(http.StatusOK, gin.H{
  93. "message": fmt.Sprintf("%s upload success!", fileHeader.Filename),
  94. })
  95. }
  96. }
  97. //多文件上传
  98. /**
  99. 多文件上传
  100. */
  101. // multiFileUploadHandle 多文件上传
  102. func multiFileUploadHandle(ctx *gin.Context) {
  103. // form 是一个存储文件信息的结构体
  104. /**
  105. type Form struct {
  106. Value map[string][]string
  107. File map[string][]*FileHeader
  108. */
  109. form, err := ctx.MultipartForm()
  110. if err != nil {
  111. ctx.JSON(http.StatusInternalServerError, gin.H{
  112. "message": err.Error(),
  113. })
  114. return
  115. }
  116. // 获取文件列表,并保存, 返回的是一个切片 []*FileHeader
  117. files := form.File["file"]
  118. for i, file := range files {
  119. targetFileName := fmt.Sprintf("C:/Users/黑熊精/Pictures/%d_%s", i, file.Filename)
  120. err = ctx.SaveUploadedFile(file, targetFileName)
  121. if err != nil {
  122. ctx.JSON(http.StatusInternalServerError, gin.H{
  123. "message": err.Error(),
  124. })
  125. return
  126. }
  127. }
  128. ctx.JSON(http.StatusOK, gin.H{
  129. "message": fmt.Sprintf("upload success!"),
  130. })
  131. }
  132. // shuldbind数据的绑定的办法
  133. // 使用 ShouldBind() 方法, 根据请求方式,自动提取 JSON, form表单 和 Query 类型的参数,放入结构体中
  134. // 用户信息信息结构体
  135. // 加上 binding:"required" 标签,说明该参数是必填的,如果不填就会报错
  136. type UserInfo struct {
  137. Username string `json:"username" form:"username" binding:"required"`
  138. Address string `json:"address" form:"address" binding:"required"`
  139. }
  140. // 获取query参数
  141. func queryHandle(ctx *gin.Context) {
  142. var userInfo UserInfo
  143. // 获取数据
  144. err := ctx.ShouldBind(&userInfo)
  145. if err == nil {
  146. ctx.JSON(http.StatusOK, gin.H{
  147. "message": "ok",
  148. "username": userInfo.Username,
  149. "address": userInfo.Address,
  150. })
  151. } else {
  152. ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
  153. }
  154. }
  155. func jsonHandle(ctx *gin.Context) {
  156. var userInfo UserInfo
  157. // 获取数据
  158. err := ctx.ShouldBind(&userInfo)
  159. if err == nil {
  160. ctx.JSON(http.StatusOK, gin.H{
  161. "message": "ok",
  162. "username": userInfo.Username,
  163. "address": userInfo.Address,
  164. })
  165. } else {
  166. ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
  167. }
  168. }
  169. func fromHandle(ctx *gin.Context) {
  170. var userInfo UserInfo
  171. // 获取数据
  172. err := ctx.ShouldBind(&userInfo)
  173. if err == nil {
  174. ctx.JSON(http.StatusOK, gin.H{
  175. "message": "ok",
  176. "username": userInfo.Username,
  177. "address": userInfo.Address,
  178. })
  179. } else {
  180. ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
  181. }
  182. }
  183. func main() {
  184. // 创建默认路由
  185. r := gin.Default()
  186. //两种浏览器地址获取参数的办法
  187. // 绑定路由规则 /user/search?username=zhangsan&address=北京
  188. r.GET("/user/search", urlQueryHandle)
  189. // 2. 绑定路由规则/user/search/lisi/北京。 获取请求URL路径中的参数的方式如下
  190. r.GET("/user/search/:username/:address", paramsPathHandle)
  191. //========================表单提交方法======================
  192. // 绑定路由规则
  193. r.POST("/user/search", formParamsHandle)
  194. //json
  195. // 绑定路由规则
  196. r.POST("/user/json", paramsJsonHandle)
  197. //
  198. // 绑定路由规则--文件上传
  199. r.POST("/upload/single", singleFileUploadHandle)
  200. 绑定路由规则--多文件上传
  201. r.POST("/upload/multi", multiFileUploadHandle)
  202. //使用 ShouldBind() 方法, 根据请求方式,自动提取 JSON, form表单 和 Query 类型的参数,放入结构体中
  203. // 绑定路由规则
  204. r.GET("/user/query", queryHandle)
  205. r.POST("/user/form", fromHandle)
  206. r.POST("/user/jsons", jsonHandle)
  207. // 监听端口
  208. r.Run(":9000")
  209. }
标签: golang gin 开发语言

本文转载自: https://blog.csdn.net/wtt234/article/details/131953861
版权归原作者 雨师@ 所有, 如有侵权,请联系我们删除。

“golang,gin框架的请求参数(一)--推荐”的评论:

还没有评论