httprouter icon indicating copy to clipboard operation
httprouter copied to clipboard

Routes with name

Open emilgpa opened this issue 11 years ago • 12 comments

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

emilgpa avatar Jun 13 '14 01:06 emilgpa

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

julienschmidt avatar Jun 13 '14 08:06 julienschmidt

:+1: on this too great job

steeve avatar Jul 28 '14 19:07 steeve

+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.

alehano avatar Aug 01 '14 08:08 alehano

+1 very useful feature.

james-lawrence avatar Jan 24 '15 23:01 james-lawrence

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

alehano avatar Jan 25 '15 09:01 alehano

+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.

fnkr avatar Mar 07 '15 18:03 fnkr

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?

digitalcraftsman avatar May 18 '15 13:05 digitalcraftsman

+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.

rickb777 avatar Aug 20 '16 17:08 rickb777

I think this issue similar to #167.

nikgalushko avatar Dec 17 '16 11:12 nikgalushko

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

bentcoder avatar Sep 20 '20 23:09 bentcoder

@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)

julienschmidt avatar Sep 21 '20 13:09 julienschmidt

@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.

bentcoder avatar Sep 21 '20 21:09 bentcoder