julienschmidt / httprouter

A high performance HTTP request router that scales well
https://pkg.go.dev/github.com/julienschmidt/httprouter
BSD 3-Clause "New" or "Revised" License
16.64k stars 1.47k forks source link

Routes with name #10

Open emilgpa opened 10 years ago

emilgpa commented 10 years ago

Hello! I would like know if is possible put a name to routes like as:

router := httprouter.New()
    router.GET("/hello/:name", Hello).Name("hello")
    ....
    routeHello := router.GetRoute("hello").Params("name", "Emilio")

If this is not possible, Do you plan add this feature?

P.D.: Very nice perfomance :+1:

Best, Emilio

julienschmidt commented 10 years ago

Currently not implemented or planned, but I leave this open as a feature request.

steeve commented 10 years ago

:+1: on this too great job

alehano commented 10 years ago

+1. It's useful when you can build url string by url name and parameters. Like in http://www.gorillatoolkit.org/pkg/mux

Registered URLs can be built, or "reversed", which helps maintaining
  references to resources.
james-lawrence commented 9 years ago

+1 very useful feature.

alehano commented 9 years ago

I solve it like this https://github.com/alehano/reverse

fnkr commented 9 years ago

+1

I solved it like this, with a proxy function:

func alternativeHandler(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
    ps = append(ps, httprouter.Param {
        Key: "extraParameter",
        Value: "someValue",
    })
    defaultHandler(w, r, ps)
}

Szenario: I have a second route and that route has 1 parameter less then the default route and I want that parameter to have the value someValue if the alternative route is used.

digitalcraftsman commented 9 years ago

This feature would be nice, because you can store all routes, handler names and parameters in a map.

I planned for incoming GET requests at example.com/api/v1 to respond with JSON that maps all available routes and methods of the API. Or is their already a way to do this without the help of named routes?

rickb777 commented 8 years ago

+1 for the need for reverse routing.

Using named routes is one way to achieve reverse routing, but there might be other ways too. For example, the leaf nodes of the tree might be wrapped into some exported type that allows a full string route URL to be reconstructed, given a list of path parameter values.

The GET method would need to be changed to return the leaf node. e.g.

router := httprouter.New()
router.GET("/", Index)
helloRoute := router.GET("/hello/:name:/role/:role", Hello)
...
helloRoute.reverse("Fred",  "Staff")

to give the path /hello/Fred/role/Staff.

nikgalushko commented 7 years ago

I think this issue similar to #167.

bentcoder commented 4 years ago

Lack of this feature forced me to dump this library because it is also very important when it comes to collecting application metrics. For instance, when we store metrics, we use "labels" to fine tune/visualise reports. If you are to store request/response metrics, you want to know which route the collected metric is associated with. Having a middleware where the http.Request allows us to extract route name with for example httprouter.RouteNameFromContext(r.Context()) would make life very easy otherwise things get very complex/messy.

The client_create below is the name of the route for Prometheus.

# HELP http_request_counter Number of HTTP requests
http_response_counter{size="20",route="client_create"} 40
julienschmidt commented 4 years ago

@BentCoder https://github.com/julienschmidt/httprouter/blob/master/router.go#L132 (not yet in a tagged release, use go get github.com/julienschmidt/httprouter@master)

bentcoder commented 4 years ago

@BentCoder https://github.com/julienschmidt/httprouter/blob/master/router.go#L132 (not yet in a tagged release, use go get github.com/julienschmidt/httprouter@master)

Not sure if it does what I mean which is same as this. I hope I made it clearer now.