http - 使用 net/http 构建子路由器的好方法
问题描述
我正在构建一个使用net/http处理多个路径的 API 服务器。我想将其构建为子路由器,但我不知道如何做。
目前,我的想法如下。
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 的多路复用器与子路由器的多路复用器不同,我认为。
// 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))
}
推荐阅读
- node.js - 如何从 puppeteer 中的 page.evaluate() 返回值?
- python - 如何在 Django REST 中使用外键字段过滤 URL,正确覆盖 get_queryset 方法
- tcl - How to fix ‘can't read "node_(0)": no such variable’ error in tcl?
- reactjs - Google 身份验证 API 返回 OPERATION_NOT_ALLOWED 400
- python - Slugify 没有将标题保存为 slug Django 2:NoReverseMatch 错误
- javascript - 一些 onClick 操作后如何转到当前页面中的另一个选项卡
- java - Matlab中多行注释的正则表达式
- solr - 如何使 SOLR 搜索功能根据搜索输入顺序返回结果
- r - 分割环,即 R 中的非完整对象(在 EBIimage 或其他中)
- google-apps-script - 如何将 Google Apps 脚本项目 ID 链接/绑定到 Google 电子表格