You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为net/http包的所有路由添加统一路由前缀?

给Go API路由统一添加/api前缀的几种方式

你当前用嵌套ServeMux的方式其实是标准库推荐的分组路由写法,不算怪异,反而能清晰分离不同前缀的路由逻辑。当然也有其他更简单的方案,可根据你的需求选择:

方案1:直接给每个路由手动加前缀

这是最直接的方式,不需要额外的ServeMux,定义路由时直接带上/api前缀即可:

package api

import "net/http"

func New() http.Handler {
    mux := http.NewServeMux()

    mux.HandleFunc("GET /api/ping", func(w http.ResponseWriter, r *http.Request) {
        w.WriteHeader(http.StatusOK)
    })

    // 其他路由统一写成 "/api/xxx" 格式
    return mux
}

优点是零额外代码,缺点是路由数量多时重复写前缀易出错,后期修改前缀需要逐个调整。

方案2:保留嵌套ServeMux(推荐)

你当前的写法是Go生态中处理路由分组的常规操作,尤其是后续需要给/api前缀添加统一中间件(比如鉴权、日志)时,这种结构会非常灵活:

package api

import "net/http"

func New() http.Handler {
    mux := http.NewServeMux()
    apiRouter := http.NewServeMux()

    apiRouter.HandleFunc("GET /ping", func(w http.ResponseWriter, r *http.Request) {
        w.WriteHeader(http.StatusOK)
    })
    // 所有API路由都注册到apiRouter中

    // 将apiRouter挂载到/api前缀下,StripPrefix会去掉请求路径中的/api,让apiRouter处理剩余部分
    mux.Handle("/api/", http.StripPrefix("/api", apiRouter))

    return mux
}

这种方式的优势在于路由分组清晰,后续可以给apiRouter单独添加中间件,比如:

// 给所有/api前缀的路由添加日志中间件
mux.Handle("/api/", http.StripPrefix("/api", loggingMiddleware(apiRouter)))

方案3:封装辅助函数自动加前缀

如果不想手动写前缀,也不想嵌套ServeMux,可以封装一个小函数自动拼接前缀:

package api

import "net/http"

func New() http.Handler {
    mux := http.NewServeMux()

    // 封装添加API路由的辅助函数
    addAPIRoute := func(method, path string, handler http.HandlerFunc) {
        fullPattern := method + " /api" + path
        mux.HandleFunc(fullPattern, handler)
    }

    addAPIRoute("GET", "/ping", func(w http.ResponseWriter, r *http.Request) {
        w.WriteHeader(http.StatusOK)
    })
    // 其他路由用addAPIRoute添加即可

    return mux
}

这个方式兼顾简洁性和可维护性,后续修改前缀只需要调整辅助函数里的/api即可。


内容的提问来源于stack exchange,提问作者baitendbidz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 21:19:55