我尝试将 url 参数传递到端点,但在尝试运行测试或通过 Postman 发送请求时出现 404 page not find 错误。
我的路线方法:
func NewListRoutes(
r *chi.Mux,
log *slog.Logger,
jwt *jwtoken.TokenService,
usecase port.ListUsecase,
) {
c := &listController{
logger: log,
jwt: jwt,
usecase: usecase,
}
// Protected routes
r.Group(func(r chi.Router) {
r.Use(jwtoken.Verifier(jwt))
r.Use(jwtoken.Authenticator())
r.Route("/user/lists", func(r chi.Router) {
r.Get("/", c.GetListsByUserID())
r.Post("/", c.CreateList())
r.Route("/{list_id}", func(r chi.Router) {
r.Get("/", c.GetListByID())
r.Put("/", c.UpdateList())
r.Delete("/", c.DeleteList())
})
})
})
}
我的测试:
func TestGetListByID_HappyPath(t *testing.T) {
u := url.URL{
Scheme: "http",
Host: host,
}
e := httpexpect.Default(t, u.String())
// Register user
r := e.POST("/register").
WithJSON(model.UserRequestData{
Email: gofakeit.Email(),
Password: randomFakePassword(),
}).
Expect().
Status(http.StatusCreated).
JSON().Object()
accessToken := r.Value(jwtoken.AccessTokenKey).String().Raw()
t.Log(accessToken)
// Create list
c := e.POST("/user/lists/").
WithHeader("Authorization", "Bearer "+accessToken).
WithJSON(model.ListRequestData{
Title: gofakeit.Word(),
}).
Expect().
Status(http.StatusCreated).
JSON().Object()
listID := c.Value("data").Object().Value("id").String().Raw()
t.Log(listID)
// Get list by ID
getListResp := e.GET("/user/lists/{list_id}").
WithPath("list_id", listID).
WithHeader("Authorization", "Bearer "+accessToken).
Expect().
Status(http.StatusOK).
JSON().Object().NotEmpty()
t.Log(getListResp.Raw())
}
=== RUN TestGetListByID_HappyPath
printer.go:57: POST http://localhost:8082/register
get_list_test.go:31:
printer.go:57: POST http://localhost:8082/user/lists/
get_list_test.go:45: 2gqBx2IyOcrXwvJi97stAdpdpIG
printer.go:57: GET http://localhost:8082/user/lists/2gqBx2IyOcrXwvJi97stAdpdpIG
reporter.go:24:
Error:
unexpected http status value
test name: TestGetListByID_HappyPath
request: GET /user/lists/2gqBx2IyOcrXwvJi97stAdpdpIG HTTP/1.1
Host: localhost:8082
Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6Im9nemoxTEhQZHdfY1V1S1p1TVF0a1hKTkxHaz0iLCJ0eXAiOiJKV1QifQ.eyJhcHBfaWQiOjEsImVtYWlsIjoibGVyYXRlcnJ5QGJyZWl0ZW5iZXJnLmluZm8iLCJleHAiOjE3MTY0MTYzNjksImlzcyI6InNzby5yc2hlbGVraG92LmNvbSIsInVzZXJfaWQiOiIyZ3FCeDBUOE83cllrczJvaFBLdkJNNkpGOWkifQ.mZPy2cnp133IJs78AjL_B5q17vkIKtfWBHH0F8hLDTsYWHhAQ8CDgI7QwmusnNNR6ktkrouhncp53IMDoGi7NACbtWigA22K2XIZXJOKMKYzVGAUEkCV3gdFeDnWWX9-isyPXZvH1YS_XXjaqrjsEgQWRIl7Kd1j8M9vLTjiHoJJU3eWTADrxe5BJWvFZ9286ePJKUVWoCrm1fN3Xi_i7U9QL2FLVTYwa-9Q6BOo5d1hHtjfgS6HoRA3y6-EpIC2DLfxO78CgU6Pwpore8TrkAvqTK2yIzV7jPUgrM5dWjxaxZt4aQAy_aSYqJWGPUMthrJg_5_ZXk-uFa6sCKXnUw
Cookie: refresh_token=2gqBwxbSh7ZUo3UlCHKWarn0KQd
response: HTTP/1.1 404 Not Found 228.666µs
Content-Length: 19
Content-Type: text/plain; charset=utf-8
Date: Wed, 22 May 2024 22:04:29 GMT
X-Content-Type-Options: nosniff
X-Ratelimit-Limit: 100
X-Ratelimit-Remaining: 98
X-Ratelimit-Reset: 1716415500
assertion:
Request("GET").Expect().Status()
expected value:
"200 OK"
actual value:
"404 Not Found"
Test: TestGetListByID_HappyPath
get_list_test.go:55: map[]
--- FAIL: TestGetListByID_HappyPath (0.13s)
在日志中我看到其他请求正常工作(注册用户、创建列表),但使用 url 参数时我遇到了这个问题。
我做错了什么?
UPD。 如果我使用查询参数,一切正常,但如果我使用 url 参数,就会出现问题
找到了解决方案,但还没有完全弄清楚为什么会这样。在我的项目中,我也有这条路线:
r.Group(func(r chi.Router) {
r.Use(jwtoken.Verifier(jwt))
r.Use(jwtoken.Authenticator())
r.Post("/logout", c.Logout())
r.Route("/user", func(r chi.Router) {
r.Get("/", c.GetUser())
r.Put("/", c.UpdateUser())
r.Delete("/", c.DeleteUser())
})
})
“/user”和“/user/lists/”的路由和处理程序之间存在冲突。我从列表的路由中删除了“用户”一词,现在一切正常:
r.Group(func(r chi.Router) {
r.Use(jwtoken.Verifier(jwt))
r.Use(jwtoken.Authenticator())
r.Route("/lists", func(r chi.Router) {
r.Get("/", c.GetListsByUserID())
r.Post("/", c.CreateList())
r.Route("/{list_id}", func(r chi.Router) {
r.Get("/", c.GetListByID())
r.Put("/", c.UpdateList())
r.Delete("/", c.DeleteList())
})
})
})