golang在一条路由上进行不同的查询

ryoqjall  于 2023-06-03  发布在  Go
关注(0)|答案(2)|浏览(298)

在Gin中,是否可以有一条路由使用:item(名称)或:id
示例:

r.GET("/inventories/(:item|:id)", controllers.FindInventory)

然后我可能会做一些像...

func FindInventory(g *gin.Context) {
    var inv models.Inventory

    if item:
       err := models.DB.Where("item = ?", g.Param("item")).First(&inv).Error
    else:
       err := models.DB.Where("id = ?", g.Param("id")).First(&inv).Error
       
    if err != nil {
        g.JSON(http.StatusBadRequest, gin.H{"error": "Record not found!"})
        return
    }

    g.JSON(http.StatusOK, gin.H{"data": inv})
}

或者有没有一种方法可以将一个路由用于两种类型的查询?

a1o7rhls

a1o7rhls1#

不,不支持此操作。但一定有办法区分物品和身份证。所以你自己很容易实现这个逻辑。
像这样:

r.GET("/inventories/:item", controllers.FindInventory)
func FindInventory(g *gin.Context) {
    var inv models.Inventory

    item := g.Param("item")
    id, err := strconv.Atoi(item)
    if err != nil {
        err := models.DB.Where("item = ?", item).First(&inv).Error
    } else {
        err := models.DB.Where("id = ?", id).First(&inv).Error
    }
    if err != nil {
        g.JSON(http.StatusBadRequest, gin.H{"error": "Record not found!"})
        return
    }

    g.JSON(http.StatusOK, gin.H{"data": inv})
}

但是如果无法区分,那么就需要有两个单独的请求路径,如

  • /inventories/by-item/:item
  • /inventories/by-id/:id
    更新于2023-05-31:将@EpicAdidash和@boyvinall的评论合并到答案中。谢谢你!
ubof19bj

ubof19bj2#

是的,你可以用params来实现,但是首先,item和id的数据应该是不同的,否则你必须求助于查询来实现

相关问题