使用net/http构建子计算机的一种好方法
我正在构建一个API服务器,它可以处理多个路径。我想把它作为一个子程序来构建,但我不知道一个好方法 目前,我的想法如下使用net/http构建子计算机的一种好方法,http,go,router,Http,Go,Router,我正在构建一个API服务器,它可以处理多个路径。我想把它作为一个子程序来构建,但我不知道一个好方法 目前,我的想法如下 主程序包 进口( “数据库/sql” “日志” “net/http” ) 类型配置结构{ db*sql.db } 类型UserRouter结构{ mux*http.ServeMux cfg*配置 } func(u*UserRouter)创建(w http.ResponseWriter,r*http.Request){ //进程处理程序逻辑 w、 写入([]字节(“创建”)) }
主程序包
进口(
“数据库/sql”
“日志”
“net/http”
)
类型配置结构{
db*sql.db
}
类型UserRouter结构{
mux*http.ServeMux
cfg*配置
}
func(u*UserRouter)创建(w http.ResponseWriter,r*http.Request){
//进程处理程序逻辑
w、 写入([]字节(“创建”))
}
func(u*UserRouter)Delete(w http.ResponseWriter,r*http.Request){
//进程处理程序逻辑
w、 写入([]字节(“删除”))
}
//NewUserRouter是子计算机。
func新用户路由器(cfg*配置)*用户路由器{
mux:=http.NewServeMux()
u:=&用户路由器{
多路复用器:多路复用器,
cfg:cfg,
}
mux.HandleFunc(“/user/create”,u.create)
mux.HandleFunc(“/user/delete”,u.delete)
返回u
}
func(u*UserRouter)ServeHTTP(w http.ResponseWriter,r*http.Request){
u、 多路复用服务TTP(w,r)
}
func main(){
mux:=http.NewServeMux()
cfg:=&Config{nil/*描述设置,如PostgreSQL.*/}
mux.Handle(“/user/”,NewUserRouter(cfg))
如果错误:=http.ListenAndServe(“:8080”,mux);错误!=nil{
log.Fatal(错误)
}
}
上面的实现似乎有点多余。但是,如果子计算机路径设置如下,HTTP服务器将无法正常工作。我认为,这是因为传递给ListendServe的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构建一个简单的子计算机是否困难?我是否需要使用类似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,将处理程序绑定到单个mux当然是合理的。RegisterUserHandler看起来是个不错的方法。非常感谢。