为了账号安全,请及时绑定邮箱和手机立即绑定

Net/http 简单动态路由

Net/http 简单动态路由

Go
潇潇雨雨 2022-07-11 14:35:16
我正在寻找一种使用 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 参数映射的副本,因为它是单个级别(不是嵌套级别)并且该问题中的许多答案都涉及使用外部库。
查看完整描述

2 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

如果您不想使用任何第三方库,则必须自己处理路径的解析。


首先,您可以这样做:


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

})


查看完整回答
反对 回复 2022-07-11
?
暮色呼如

TA贡献1853条经验 获得超9个赞

您可以使用 http.HandleFunc。在这个函数中,以斜线结尾的模式定义了一个子树。您可以使用模式“/page/”注册处理程序函数,如下例所示。


package main


import (

    "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


查看完整回答
反对 回复 2022-07-11
  • 2 回答
  • 0 关注
  • 102 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信