登录
首页 >  Golang >  Go问答

构建嵌套路由器的最佳方法是使用net/http

来源:stackoverflow

时间:2024-03-01 11:18:23 335浏览 收藏

大家好,我们又见面了啊~本文《构建嵌套路由器的最佳方法是使用net/http》的内容中将会涉及到等等。如果你正在学习Golang相关知识,欢迎关注我,以后会给大家带来更多Golang相关文章,希望我们能一起进步!下面就开始本文的正式内容~

问题内容

我正在构建一个 api 服务器,它可以使用 net/http 处理多个路径。我想将其构建为子路由器,但我不知道有什么好方法。

目前,我的想法如下。

package main

import (
    "database/sql"
    "log"
    "net/http"
)

type config struct {
    db *sql.db
}

type userrouter struct {
    mux *http.servemux
    cfg *config
}

func (u *userrouter) create(w http.responsewriter, r *http.request) {
    // process handler logic
    w.write([]byte("create"))
}

func (u *userrouter) delete(w http.responsewriter, r *http.request) {
    // process handler logic
    w.write([]byte("delete"))
}

// newuserrouter is subrouter.
func newuserrouter(cfg *config) *userrouter {
    mux := http.newservemux()
    u := &userrouter{
        mux: mux,
        cfg: cfg,
    }
    mux.handlefunc("/user/create", u.create)
    mux.handlefunc("/user/delete", u.delete)
    return u
}

func (u *userrouter) servehttp(w http.responsewriter, r *http.request) {
    u.mux.servehttp(w, r)
}

func main() {
    mux := http.newservemux()
    cfg := &config{nil /* describes settings such as postgresql. */}
    mux.handle("/user/", newuserrouter(cfg))
    if err := http.listenandserve(":8080", mux); err != nil {
        log.fatal(err)
    }
}

上面的实现看起来有点多余。但是,如果子路由器路径设置如下,http 服务器将无法按预期工作。我认为这是因为传递给 listenandserve 的 mux 与子路由器的 mux 不同。

// NewUserRouter is subrouter.
func NewUserRouter(cfg *Config) *UserRouter {
    mux := http.NewServeMux()
    u := &UserRouter{
        mux: mux,
        cfg: cfg,
    }
-   mux.HandleFunc("/user/create", u.Create)
-   mux.HandleFunc("/user/delete", u.Delete)
+   mux.HandleFunc("/create", u.Create)
+   mux.HandleFunc("/delete", u.Delete)
    return u
}

使用 net/http 构建一个简单的子路由器是否困难?我是否需要使用 go-chi/chi 或 gorilla/mux 等 waf?


解决方案


如果您的目标是将用户处理程序的注册与其他处理程序分开,请执行以下操作。不需要子路由器。

type UserRouter struct {
    cfg *Config

    // prefix is the path prefix for the user handlers. Use this
    // value to construct paths to other user handlers.
    prefix string 
}

// RegisterUserHandler adds the user handlers to mux using the
// specified path prefix.
func RegisterUserHandler(cfg *Config, prefix string, mux *http.ServeMux)  {
    u := &UserRouter{cfg: cfg, prefix: prefix}
    mux.HandleFunc(prefix+"/create", u.Create)
    mux.HandleFunc(prefix+"/delete", u.Delete)
}

func main() {
    mux := http.NewServeMux()
    cfg := &Config{nil /* Describes settings such as PostgreSQL. */}
    RegisterUserHandler(cfg, "/user", mux)
    log.Fatal(http.ListenAndServe(":8080", mux))
}

本篇关于《构建嵌套路由器的最佳方法是使用net/http》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>