Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用net/http构建子计算机的一种好方法_Http_Go_Router - Fatal编程技术网

使用net/http构建子计算机的一种好方法

使用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、 写入([]字节(“创建”)) }

我正在构建一个API服务器,它可以处理多个路径。我想把它作为一个子程序来构建,但我不知道一个好方法

目前,我的想法如下

主程序包
进口(
“数据库/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看起来是个不错的方法。非常感谢。