iT邦幫忙

1

有關Golang的Gin套件路徑設定問題

  • 分享至 

  • xImage

想試做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(&param); 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流程是照網路上的文章教學寫的。

雷N iT邦研究生 1 級 ‧ 2021-09-07 12:37:28 檢舉
你的人員名單存放在哪? 怎比對的
你可以找不到9527yyy, 直接就 res.JSON(404, xxxx)
雷N iT邦研究生 1 級 ‧ 2021-09-07 12:39:04 檢舉
/users/:name 這是binding, 你用/users/9527yyy, path match rule是滿足的
你內部的handler會拿name來操作吧, 不然設置這:name的用途是@@?
samuraigo iT邦新手 4 級 ‧ 2021-09-07 16:39:45 檢舉
:name 拿來在GetUser這裡當param用,我把code補上去了,還請大大指點一下><
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

1
whitefloor
iT邦研究生 2 級 ‧ 2021-09-07 07:37:14

https://github.com/gin-gonic/gin#bind-uri

我的直覺是你middleware有問題...

看更多先前的回應...收起先前的回應...
samuraigo iT邦新手 4 級 ‧ 2021-09-07 16:40:48 檢舉

感謝大大回覆,我有補上handler的code了,感覺是不是GetUser那邊for出來的條件寫錯><

whitefloor iT邦研究生 2 級 ‧ 2021-09-07 21:47:50 檢舉

我有實測過一遍 這code是好的
你不曉得是哪裡ping錯吧

whitefloor iT邦研究生 2 級 ‧ 2021-09-07 21:59:53 檢舉

你可能把你的request貼出來看看
我用肉眼辨識和實際去ping都是沒問題的

samuraigo iT邦新手 4 級 ‧ 2021-09-08 15:09:32 檢舉

感謝大大,詭異的事發生了,我請求改用Chrome直接下Request就是正常的,之前發生那個問題是用postman去request,該不會是postman的問題...

whitefloor iT邦研究生 2 級 ‧ 2021-09-08 20:43:52 檢舉

我也是用postman 可能request打錯吧

samuraigo iT邦新手 4 級 ‧ 2021-09-10 11:06:28 檢舉

了解!非常感謝大大的回覆! 目前問題暫時解決了!

我要發表回答

立即登入回答