Net/http 简单动态路由

我正在寻找一种使用 net/http 创建动态路由的简单方法(没有诸如 mux 之类的路由器)。这是我当前的代码:


http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {


        pages := r.URL.Query()["q"]

        if len(pages) == 0 {

            fmt.Fprintf(w, "§§§§§§§§§§ You need to specify a page §§§§§§§§§§")

            return

        }


        page := pages[0]


        var a Page

        err := db.QueryRow("SELECT * FROM pages where page = ?", page).Scan(&a.Page, &a.Date, &a.Url)

        a.Year = time.Now().UTC().Year()

        if err != nil {

            if err == sql.ErrNoRows {

                fmt.Fprintf(w, "Page %s not found", page)

                return

            } else {

                fmt.Fprintf(w, "Some error happened")

                return

            }

        }


        http.Redirect(w, r, a.Url, 301)


    })

所以现在 URL sample.com/?q= 可以动态工作。我的目标是工作而不必直接使用 r.URL.Query()["q"] /pagename


这不是Go url 参数映射的副本,因为它是单个级别(不是嵌套级别)并且该问题中的许多答案都涉及使用外部库。


潇潇雨雨
浏览 103回答 2
2回答

白猪掌柜的

如果您不想使用任何第三方库,则必须自己处理路径的解析。首先,您可以这样做:http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {    page := r.URL.Path[1:]    // do whatever logic you want    // mind that the page could be "multi/level/path/" as well})

暮色呼如

您可以使用 http.HandleFunc。在这个函数中,以斜线结尾的模式定义了一个子树。您可以使用模式“/page/”注册处理程序函数,如下例所示。package mainimport (    "net/http"    "fmt")func handler(w http.ResponseWriter, r *http.Request) {    if is_valid_page(r.URL) {        fmt.Fprint(w, "This is a valid page")    } else {        w.WriteHeader(http.StatusNotFound)        fmt.Fprint(w, "Error 404 - Page not found")    }}func is_valid_page(page string) {    // check here if page is valid from url }func main() {    http.HandleFunc("/page/", handler)    http.ListenAndServe(":8080", nil)}您可以在这里找到更多信息:https ://golang.org/pkg/net/http/#ServeMux
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go