golang http:如何将请求路由到处理程序

时间:2017-10-23 02:29:21

标签: http go

我是Golang上的新手,并提出了一个关于构建网络服务器的简单问题。

说我的网络服务器有用户,所以用户可以更改他们的名字和密码。以下是我设计网址的方式:

/users/Test         GET
/users/Test/rename       POST   newname=Test2
/users/Test/newpassword  POST   newpassword=PWD

第一行是显示名为Test的用户的信息。第二个和第三个是重命名和重置密码。

所以我认为我需要使用一些正则表达式来匹配HTTP请求,例如http.HandleFunc("/users/{\w}+", controller.UsersHandler)

然而,Golang似乎并不支持这样的事情。那么这是否意味着我必须改变我的设计?例如,要显示用户Test的信息,我必须/users GET name=Test

2 个答案:

答案 0 :(得分:1)

您可能希望在r.URL.Path上运行模式匹配,使用正则表达式包(在您的情况下,您可能需要在POST上)This post显示一些模式匹配示例。正如@Eugene建议的那样,路由器/ http实用程序包也可以提供帮助。

如果你不想使用其他软件包,可以给你一些想法:

主要:

http.HandleFunc("/", multiplexer)
...
func multiplexer(w http.ResponseWriter, r *http.Request) {
    switch r.method {
    case "GET":
        getHandler(w, r)
    case "POST":
        postHandler(w, r)
    }
}

func getHandler(w http.ResponseWriter, r *http.Request) {

    //Match r.URL.path here as required using switch/use regex on it
}

func postHandler(w http.ResponseWriter, r *http.Request) {

    //Regex as needed on r.URL.Path 
    //and then get the values POSTed
    name := r.FormValue("newname")
}

答案 1 :(得分:0)

不幸的是,标准的http路由器并不精通。有两种方式:

手动检查方法,网址和提取用户名。

使用其他软件包中的路由器 https://github.com/gorilla/mux

大猩猩混合,回声金银花等