首页  >  文章  >  后端开发  >  如何在 Go julienschmidt/httprouter 中嵌套路由器?

如何在 Go julienschmidt/httprouter 中嵌套路由器?

王林
王林转载
2024-02-08 23:24:25769浏览

如何在 Go julienschmidt/httprouter 中嵌套路由器?

php小编鱼仔为您带来一篇关于在Go语言中使用julienschmidt/httprouter嵌套路由器的简洁指南。julienschmidt/httprouter是一个轻量级的高性能HTTP请求路由器,它可以帮助我们更好地组织和管理路由。本文将详细介绍如何在Go语言中使用julienschmidt/httprouter实现嵌套路由器的功能,以便更好地满足复杂的路由需求。无论您是初学者还是有经验的开发者,本文都将为您提供简单易懂的步骤和示例代码,帮助您轻松掌握嵌套路由器的使用技巧。让我们一起开始吧!

问题内容

我想从我的服务公开以下 url:

get /api/foo
get /api/bar

我还想将其构造为嵌套在另一个路由器中的路由器。顶级路由器将匹配对 /api 的所有请求,并使用嵌套路由器为它们提供服务,该嵌套路由器将匹配对 /foo/bar 的请求。基本上,命名空间。

我可以只有一个路由器,并为两条路由提供 /api 前缀:

router.get("/api/foo", apifoo)
router.get("/api/bar", apibar)

但我希望为 /api 前缀内的所有路由使用单个路由器,以便我可以通过单个函数调用向它们添加适当的中间件。

这是我尝试过的:

package main

import (
    "log"
    "net/http"

    "github.com/julienschmidt/httprouter"
)

func apiFoo(w http.ResponseWriter, r *http.Request) {}
func apiBar(w http.ResponseWriter, r *http.Request) {}

func main() {
    api := httprouter.New()
    api.HandlerFunc(http.MethodGet, "/foo", apiFoo)
    api.HandlerFunc(http.MethodGet, "/bar", apiBar)

    router := httprouter.New()
    router.Handler(http.MethodGet, "/api", api)

    log.Fatal(http.ListenAndServe(":8080", router))
}

但是,访问 http://localhost:8080/api/foo 或 http://localhost:8080/api/bar 时找不到 404

我原以为嵌套路由器会起作用,因为路由器实现了 http.handler 接口。我错过了什么?

解决方法

httprouter 不会连接路径,所以你不能那样做。两个路由器只会检查请求路径并采取相应的行动。

有一个 7 年的公开拉取请求,可以实现它。你可以看看那里并自己实现类似的逻辑,PR 基于连接路径。也许你可以为此编写一个小辅助函数。

如果您愿意切换路由器软件包,您可以考虑替代方案,例如 chi,支持路由器组。

以上是如何在 Go julienschmidt/httprouter 中嵌套路由器?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文转载于:stackoverflow.com。如有侵权,请联系admin@php.cn删除