How can i refactor/organise my routes in gin golang that contains a lot of routes?

huangapple go评论106阅读模式
英文:

How can i refactor/organise my routes in gin golang that contains a lot of routes?

问题

如您所见,我有很多路由。如何以更好的方式进行结构化/重构?是否有更好的方法或者是否不需要重构?这段代码是我请求处理程序的一部分,与数据库(mongodb)通信。我在gin golang的GitHub上找不到相关文档。如果有办法缩短代码,那就太好了。

  1. package routes
  2. import (
  3. "fmt"
  4. "net/http"
  5. "strconv"
  6. "foldername/db"
  7. "github.com/gin-gonic/gin"
  8. )
  9. func UserRoute(router *gin.Engine) {
  10. router.GET("/address/:query", func(c *gin.Context) {
  11. param := c.Param("query")
  12. page := c.Request.URL.Query().Get("page")
  13. pageStr, err := strconv.Atoi(page)
  14. if err != nil {
  15. fmt.Println(err)
  16. }
  17. query, err := db.ReturnSingleAddress(param)
  18. if err != nil {
  19. fmt.Println(err)
  20. }
  21. countTransactions, err := db.CountTransactions(param)
  22. if err != nil {
  23. fmt.Println(err)
  24. }
  25. transactions, err := db.ReturnTransactions(param, pageStr, 15)
  26. if err != nil {
  27. fmt.Println(err)
  28. }
  29. c.JSON(http.StatusOK, gin.H{"address": query, "transactions": transactions, "total_transactions": countTransactions})
  30. })
  31. router.GET("/", func(c *gin.Context) {
  32. c.JSON(http.StatusOK, gin.H{
  33. "datetime": db.ReturnDateTime(),
  34. "countwallets": db.CountWallets(),
  35. })
  36. })
  37. router.GET("/tx/:query", func(c *gin.Context) {
  38. value := c.Param("query")
  39. query, err := db.ReturnSingleTransfer(value)
  40. if err != nil {
  41. fmt.Println(err)
  42. }
  43. c.JSON(http.StatusOK, gin.H{"response": query})
  44. })
  45. router.GET("/coinbase/:query", func(c *gin.Context) {
  46. value := c.Param("query")
  47. query, err := db.ReturnSingleTransfer(value)
  48. if err != nil {
  49. fmt.Println(err)
  50. }
  51. c.JSON(http.StatusOK, gin.H{"response": query})
  52. })
  53. router.GET("/rank/:query", func(c *gin.Context) {
  54. value := c.Param("query")
  55. query, err := db.ReturnRankAddress(value)
  56. if err != nil {
  57. fmt.Println(err)
  58. }
  59. c.JSON(http.StatusOK, gin.H{"response": query})
  60. })
  61. router.GET("/richlist", func(c *gin.Context) {
  62. c.JSON(http.StatusOK, gin.H{"richlist": db.ReturnRichlist()})
  63. })
  64. router.GET("/blocks", func(c *gin.Context) {
  65. query, err := db.ReturnLatestBlocks()
  66. if err != nil {
  67. fmt.Println(err)
  68. }
  69. c.JSON(http.StatusOK, gin.H{"response": query})
  70. })
  71. router.GET("/validators", func(c *gin.Context) {
  72. query, err := db.ReturnValidators()
  73. if err != nil {
  74. fmt.Println(err)
  75. }
  76. c.JSON(http.StatusOK, gin.H{"response": query})
  77. })
  78. router.GET("/transactions", func(c *gin.Context) {
  79. query, err := db.ReturnLatestTransactions()
  80. if err != nil {
  81. fmt.Println(err)
  82. }
  83. c.JSON(http.StatusOK, gin.H{"response": query})
  84. })
  85. router.GET("/contracts", func(c *gin.Context) {
  86. query, err := db.ReturnContracts()
  87. if err != nil {
  88. fmt.Println(err)
  89. }
  90. c.JSON(http.StatusOK, gin.H{"response": query})
  91. })
  92. router.GET("/alltransactions/:query", func(c *gin.Context) {
  93. value := c.Param("query")
  94. query, err := db.ReturnAllTransactionsByAddress(value)
  95. if err != nil {
  96. fmt.Println(err)
  97. }
  98. c.JSON(http.StatusOK, gin.H{"response": query})
  99. })
  100. router.GET("/walletdistribution/:query", func(c *gin.Context) {
  101. value := c.Param("query")
  102. wallets, err := strconv.ParseUint(value, 10, 64)
  103. if err != nil {
  104. fmt.Println(err)
  105. }
  106. query, err := db.ReturnWalletDistribution(wallets)
  107. if err != nil {
  108. fmt.Println(err)
  109. }
  110. c.JSON(http.StatusOK, gin.H{"response": query})
  111. })
  112. router.GET("/blockhashbn/:query", func(c *gin.Context) {
  113. value := c.Param("query")
  114. queryHash, err := db.ReturnHashToBlockNumber(value)
  115. if err != nil {
  116. fmt.Println(err)
  117. }
  118. c.JSON(http.StatusOK, gin.H{"response": queryHash})
  119. })
  120. router.GET("/block/:query", func(c *gin.Context) {
  121. value := c.Param("query")
  122. intValue, err := strconv.ParseUint(value, 10, 64)
  123. if err != nil {
  124. fmt.Println(err)
  125. }
  126. query, err := db.ReturnSingleBlock(intValue)
  127. if err != nil {
  128. fmt.Println(err)
  129. }
  130. c.JSON(http.StatusOK, gin.H{"response": query})
  131. })
  132. router.GET("/contractcode/:query", func(c *gin.Context) {
  133. value := c.Param("query")
  134. query, err := db.ReturnContractCode(value)
  135. if err != nil {
  136. fmt.Println(err)
  137. }
  138. c.JSON(http.StatusOK, gin.H{"response": query})
  139. })
  140. }
英文:

As you can see, i got a lot of routes. How can i structure/refactor this in a better way? Is there a better way or is it not needed? This code is part of my request handler, communicating with database(mongodb). I couldn't find documentation about this at the gin golang github. If there was a way to shorten it, that would be great.

  1. package routes
  2. import (
  3. "fmt"
  4. "net/http"
  5. "strconv"
  6. "foldername/db"
  7. "github.com/gin-gonic/gin"
  8. )
  9. func UserRoute(router *gin.Engine) {
  10. router.GET("/address/:query", func(c *gin.Context) {
  11. param := c.Param("query")
  12. page := c.Request.URL.Query().Get("page")
  13. pageStr, err := strconv.Atoi(page)
  14. if err != nil {
  15. fmt.Println(err)
  16. }
  17. query, err := db.ReturnSingleAddress(param)
  18. if err != nil {
  19. fmt.Println(err)
  20. }
  21. countTransactions, err := db.CountTransactions(param)
  22. if err != nil {
  23. fmt.Println(err)
  24. }
  25. transactions, err := db.ReturnTransactions(param, pageStr, 15)
  26. if err != nil {
  27. fmt.Println(err)
  28. }
  29. c.JSON(http.StatusOK, gin.H{"address": query, "transactions": transactions, "total_transactions": countTransactions})
  30. })
  31. router.GET("/", func(c *gin.Context) {
  32. c.JSON(http.StatusOK, gin.H{
  33. "datetime": db.ReturnDateTime(),
  34. "countwallets": db.CountWallets(),
  35. })
  36. })
  37. router.GET("/tx/:query", func(c *gin.Context) {
  38. value := c.Param("query")
  39. query, err := db.ReturnSingleTransfer(value)
  40. if err != nil {
  41. fmt.Println(err)
  42. }
  43. c.JSON(http.StatusOK, gin.H{"response": query})
  44. })
  45. router.GET("/coinbase/:query", func(c *gin.Context) {
  46. value := c.Param("query")
  47. query, err := db.ReturnSingleTransfer(value)
  48. if err != nil {
  49. fmt.Println(err)
  50. }
  51. c.JSON(http.StatusOK, gin.H{"response": query})
  52. })
  53. router.GET("/rank/:query", func(c *gin.Context) {
  54. value := c.Param("query")
  55. query, err := db.ReturnRankAddress(value)
  56. if err != nil {
  57. fmt.Println(err)
  58. }
  59. c.JSON(http.StatusOK, gin.H{"response": query})
  60. })
  61. router.GET("/richlist", func(c *gin.Context) {
  62. c.JSON(http.StatusOK, gin.H{"richlist": db.ReturnRichlist()})
  63. })
  64. router.GET("/blocks", func(c *gin.Context) {
  65. query, err := db.ReturnLatestBlocks()
  66. if err != nil {
  67. fmt.Println(err)
  68. }
  69. c.JSON(http.StatusOK, gin.H{"response": query})
  70. })
  71. router.GET("/validators", func(c *gin.Context) {
  72. query, err := db.ReturnValidators()
  73. if err != nil {
  74. fmt.Println(err)
  75. }
  76. c.JSON(http.StatusOK, gin.H{"response": query})
  77. })
  78. router.GET("/transactions", func(c *gin.Context) {
  79. query, err := db.ReturnLatestTransactions()
  80. if err != nil {
  81. fmt.Println(err)
  82. }
  83. c.JSON(http.StatusOK, gin.H{"response": query})
  84. })
  85. router.GET("/contracts", func(c *gin.Context) {
  86. query, err := db.ReturnContracts()
  87. if err != nil {
  88. fmt.Println(err)
  89. }
  90. c.JSON(http.StatusOK, gin.H{"response": query})
  91. })
  92. router.GET("/alltransactions/:query", func(c *gin.Context) {
  93. value := c.Param("query")
  94. query, err := db.ReturnAllTransactionsByAddress(value)
  95. if err != nil {
  96. fmt.Println(err)
  97. }
  98. c.JSON(http.StatusOK, gin.H{"response": query})
  99. })
  100. router.GET("/walletdistribution/:query", func(c *gin.Context) {
  101. value := c.Param("query")
  102. wallets, err := strconv.ParseUint(value, 10, 64)
  103. if err != nil {
  104. fmt.Println(err)
  105. }
  106. query, err := db.ReturnWalletDistribution(wallets)
  107. if err != nil {
  108. fmt.Println(err)
  109. }
  110. c.JSON(http.StatusOK, gin.H{"response": query})
  111. })
  112. router.GET("/blockhashbn/:query", func(c *gin.Context) {
  113. value := c.Param("query")
  114. queryHash, err := db.ReturnHashToBlockNumber(value)
  115. if err != nil {
  116. fmt.Println(err)
  117. }
  118. c.JSON(http.StatusOK, gin.H{"response": queryHash})
  119. })
  120. router.GET("/block/:query", func(c *gin.Context) {
  121. value := c.Param("query")
  122. intValue, err := strconv.ParseUint(value, 10, 64)
  123. if err != nil {
  124. fmt.Println(err)
  125. }
  126. query, err := db.ReturnSingleBlock(intValue)
  127. if err != nil {
  128. fmt.Println(err)
  129. }
  130. c.JSON(http.StatusOK, gin.H{"response": query})
  131. })
  132. router.GET("/contractcode/:query", func(c *gin.Context) {
  133. value := c.Param("query")
  134. query, err := db.ReturnContractCode(value)
  135. if err != nil {
  136. fmt.Println(err)
  137. }
  138. c.JSON(http.StatusOK, gin.H{"response": query})
  139. })
  140. }

答案1

得分: 1

个人而言,我喜欢将处理程序函数移动到单独的文件和目录中,这些文件和目录代表API,这样你只需要引用处理程序而不是使用内联函数。在你的情况下,我建议重新组织你的路径,这样你可以将它们分组到共同的根路径下。

英文:

Personally, I like to move my handler functions into separate files and directories which represent the API, so that you only need to reference the handlers instead of using inline functions. In your case I would suggest restructuring your paths, so that you can group them to common root paths.

huangapple
  • 本文由 发表于 2022年10月22日 20:05:30
  • 转载请务必保留本文链接:https://go.coder-hub.com/74163408.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定