在 Golang 中使用 Chi 路由器将参数传递到 URL 时出现 404 错误

问题描述 投票:0回答:1

我尝试将 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 参数,就会出现问题

go go-chi
1个回答
0
投票

找到了解决方案,但还没有完全弄清楚为什么会这样。在我的项目中,我也有这条路线:

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())
            })
        })
    })
© www.soinside.com 2019 - 2024. All rights reserved.