想試做Gin的REST API,我的路徑設定如下:
r.GET("/users", handlers.ListUsers) //show出全部的人員
r.GET("/users/:name", handlers.GetUser) //只show指定的那個人
app run起來之後,postman下“http://localhost:8088/users”
第一個GET的users是列出所有人員名單並執行正常。
postman下"http://localhost:8088/users/99688@gmail.com"
也正常執行可以找到99688@gmail這個人。
詭異的地方來了,如果我/users/之後亂下,比如:
"http://localhost:8088/users/9527yyy"
這樣他一樣會執行/users的秀出全部人員...
之前在弄React router的時候好像有看到一個什麼動態匹配會後面找不到就直接匹配到前面第一個能執行的uri,請問Gin這裡也是一樣嗎?
有沒有辦法強制他不要動態匹配,希望能/users後面沒匹配到就直接報錯這樣。
剛接觸GO還有很多地方不懂,還請大大們多多包涵,指點一下小弟,感激不盡。
敢問下面兩位大大的回覆,我po一下Handler的Code
var users = []models.User{
{UserName: "99688@gmail.com", Password: "123", Age: 25},
{UserName: "77988@gmail.com", Password: "321", Age: 36},
}
// ListUsers
func ListUsers(c *gin.Context) {
c.JSON(http.StatusOK, users)
}
// GetUser
func GetUser(c *gin.Context) {
var param struct {
Name string `uri:"name"`
}
if err := c.ShouldBindUri(¶m); err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"error": err.Error(),
})
return
}
for _, u := range users {
if u.UserName == param.Name {
c.JSON(http.StatusOK, u)
return
}
}
c.JSON(http.StatusNotFound, gin.H{
"error": fmt.Sprintf("user %s not found", param.Name),
})
原因是不是出在 for _, u := range users 這裡呢?總覺得這裡不太對勁,整個code流程是照網路上的文章教學寫的。
https://github.com/gin-gonic/gin#bind-uri
我的直覺是你middleware有問題...