Go 如何在net/http中编写/api/v1/users/id/{id}?

Go 如何在net/http中编写/api/v1/users/id/{id}?,go,Go,例如,我想做/api/v1/users/id/{id} 目前,我有以下几点: mux := http.NewServeMux() mux.Handle("/api/v1/users", HandleUsersV1{db: db, mux: mux}) log.Fatal(http.ListenAndServe(fmt.Sprintf("%s%d", ":", portNumber), mux)) 我想: mux := http.NewServeMux() mux.Handle("/api/v1

例如,我想做/api/v1/users/id/{id}

目前,我有以下几点:

mux := http.NewServeMux()
mux.Handle("/api/v1/users", HandleUsersV1{db: db, mux: mux})
log.Fatal(http.ListenAndServe(fmt.Sprintf("%s%d", ":", portNumber), mux))
我想:

mux := http.NewServeMux()
mux.Handle("/api/v1", HandleV1{})
然后在HandleV1中:

我知道Gorilla Mux可以用PathPrefix为我做这件事,但我更喜欢net/http

标准的net/http不支持动态路径段,因此/{id}不会像您想象的那样工作。至于前缀,你可以用这个

标准的net/http不支持动态路径段,因此/{id}无法按您想象的方式工作。至于前缀,你可以用这个

我建议使用。但如果你坚持的话

package main

import (
    "log"
    "net/http"
    "strconv"
    "strings"
)

func main() {
    res := resourceone{}
    http.HandleFunc("/api/v1/users/", res.router)
    log.Fatal(http.ListenAndServe(":8080", nil))
}

type resourceone struct {
}

func (res *resourceone) router(w http.ResponseWriter, r *http.Request) {
    args := strings.Split(r.URL.String()[len(`/api/v1/users/`):], `/`)
    switch args[0] {
    case `id`:
        id, _ := strconv.Atoi(args[1])
        res.one(w, r, id)
    case `name`:
        res.two(w, r, args[1])
    }
}

func (res *resourceone) one(w http.ResponseWriter, r *http.Request, id int) {
    w.Write([]byte(strconv.Itoa(id)))
}

func (res *resourceone) two(w http.ResponseWriter, r *http.Request, name string) {
    w.Write([]byte(name))
}
测试:

curl 127.0.0.1:8080/api/v1/users/name/david

curl 127.0.0.1:8080/api/v1/users/id/1234

我建议使用。但如果你坚持的话

package main

import (
    "log"
    "net/http"
    "strconv"
    "strings"
)

func main() {
    res := resourceone{}
    http.HandleFunc("/api/v1/users/", res.router)
    log.Fatal(http.ListenAndServe(":8080", nil))
}

type resourceone struct {
}

func (res *resourceone) router(w http.ResponseWriter, r *http.Request) {
    args := strings.Split(r.URL.String()[len(`/api/v1/users/`):], `/`)
    switch args[0] {
    case `id`:
        id, _ := strconv.Atoi(args[1])
        res.one(w, r, id)
    case `name`:
        res.two(w, r, args[1])
    }
}

func (res *resourceone) one(w http.ResponseWriter, r *http.Request, id int) {
    w.Write([]byte(strconv.Itoa(id)))
}

func (res *resourceone) two(w http.ResponseWriter, r *http.Request, name string) {
    w.Write([]byte(name))
}
测试:

curl 127.0.0.1:8080/api/v1/users/name/david


curl 127.0.0.1:8080/api/v1/users/id/1234

听起来你真的很想要Gorilla mux。不清楚你为什么拒绝它。我更喜欢使用Golang默认处理程序,而不是gorilla处理程序。我试图限制框架的使用。好吧,你可以重新发明轮子,自己编写一些非常复杂的路由器,或者使用一个真正值得使用的库。Mux并不是一个真正的框架;这是一个非常轻量级的库。我认为你拒绝它是因为你想限制外部依赖,但是mux非常有用,它值得包括在任何服务HTTP的项目中。听起来你真的想要Gorilla mux。不清楚你为什么拒绝它。我更喜欢使用Golang默认处理程序,而不是gorilla处理程序。我试图限制框架的使用。好吧,你可以重新发明轮子,自己编写一些非常复杂的路由器,或者使用一个真正值得使用的库。Mux并不是一个真正的框架;这是一个非常轻量级的库。我认为你拒绝它是因为你想限制外部依赖,但是mux非常有用,几乎任何服务于HTTP的项目都值得包含它。这个答案可以对OP选择的库进行更多的解释,更少的批评。如果你坚持的话,就幽默地说。我最终花时间写了一些东西来帮助他们。虽然如果@Flimzy说点什么,我很想道歉。我认为对每一件小事都使用政治正确的枪对任何社区都没有好处。我还认为代码是直截了当的,如果有人要求,我很乐意详细说明。这个答案可以使用更多的解释,而不是批评OP的图书馆选择。如果你坚持说幽默。我最终花时间写了一些东西来帮助他们。虽然如果@Flimzy说点什么,我很想道歉。我认为对每一件小事都使用政治正确的枪对任何社区都没有好处。我还认为代码是直截了当的,如果有人要求,我很乐意详细说明。谢谢!它起作用了;不幸的是,如果我自己输入/api/v1/,它将从URL中删除它,这是一个不幸的副作用。非常感谢!它起作用了;不幸的是,如果我自己输入/api/v1/,它将从URL中删除它,这是一个不幸的副作用。
package main

import (
    "log"
    "net/http"
    "strconv"
    "strings"
)

func main() {
    res := resourceone{}
    http.HandleFunc("/api/v1/users/", res.router)
    log.Fatal(http.ListenAndServe(":8080", nil))
}

type resourceone struct {
}

func (res *resourceone) router(w http.ResponseWriter, r *http.Request) {
    args := strings.Split(r.URL.String()[len(`/api/v1/users/`):], `/`)
    switch args[0] {
    case `id`:
        id, _ := strconv.Atoi(args[1])
        res.one(w, r, id)
    case `name`:
        res.two(w, r, args[1])
    }
}

func (res *resourceone) one(w http.ResponseWriter, r *http.Request, id int) {
    w.Write([]byte(strconv.Itoa(id)))
}

func (res *resourceone) two(w http.ResponseWriter, r *http.Request, name string) {
    w.Write([]byte(name))
}