【问题标题】:How to add different endpoints with the same path prefix and param in Gin?如何在 Gin 中添加具有相同路径前缀和参数的不同端点?
【发布时间】:2022-01-25 00:55:48
【问题描述】:


我使用Gin 框架在Go 中构建了一个API。我在 API 中有一条路线,我可以使用id 获取用户。但现在我也想通过用户名来获取用户。所以我尝试了与id 获取用户相同的方法。但它在编译期间给了我一个错误。各位大侠能告诉我怎么做吗?
谢谢。
路线 -

grp.GET("/users", controllers.GetUsers)
grp.GET("/users/:id", controllers.GetUser)
grp.GET("/users/:username", controllers.GetUserByUsername)   //error - panic: ':username' in new path '/users/:username' conflicts with existing wildcard ':id' in existing prefix '/users/:id'
grp.POST("/users", controllers.CreateUser)
grp.PATCH("/users/:id", controllers.UpdateUser)
grp.DELETE("/users/:id", controllers.DeleteUser)

控制器 -

func GetUser(c *gin.Context) {
    paramID := c.Params.ByName("id")

    ctx := context.Background()
    sa := option.WithCredentialsFile(firestoreFilePath)
    app, err := firebase.NewApp(ctx, nil, sa)
    if err != nil {
        log.Fatalln(err)
    }

    client, err := app.Firestore(ctx)
    if err != nil {
        log.Fatalln(err)
    }
    defer client.Close()

    dsnap, err := client.Collection("users").Doc(paramID).Get(ctx)
    if err != nil {
        fmt.Print(err)
        c.IndentedJSON(http.StatusNotFound, gin.H{
            "message": "User not found",
        })
        return
    }
    m := dsnap.Data()

    c.IndentedJSON(http.StatusNotFound, gin.H{
        "User":    m,
        "message": "User returned successfully",
    })

}

API 响应 -

[
  {
     "id": 1,
     "name": "Leanne Graham",
     "username": "Bret",
     "email": "Sincere@april.biz",
  },
  {
    "id": 2,
    "name": "Ervin Howell",
    "username": "Antonette",
    "email": "Shanna@melissa.tv",
  },
  {
    "id": 3,
    "name": "Clementine Bauch",
    "username": "Samantha",
    "email": "Nathan@yesenia.net",
  }
]

【问题讨论】:

    标签: go go-gin


    【解决方案1】:

    这是杜松子酒的一个已知限制。您必须使所有路径都独一无二。就像添加一个前缀如下:

    grp.GET("/users/username/:username", controllers.GetUserByUsername)
    

    关于这个问题线程的更多信息: https://github.com/gin-gonic/gin/issues/1301

    【讨论】:

    • 仍然出现同样的错误
    • 是的,问题线程中有一个建议的解决方法,它添加了一个后缀,但它可能已经过时了。一个前缀至少会起作用。更新了答案。
    猜你喜欢
    • 2022-11-20
    • 2020-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 2019-03-07
    相关资源
    最近更新 更多