Comments (8)
+1 for matching http.Handler
from httprouter.
Another thought: if httprouter mirrored the http package and used a Handler type
instead of the Handle function type:
type Handler interface {
ServeHTTPRoute(http.RequestWriter, *http.Request, Params)
}
and the underlying storage was changed to store Handler rather than
Handle, then we'd get the above desired functionality automatically,
because it would be possible for callers to type-assert the returned
Handler to some other type.
Interface types can be nicer to debug too, being less opaque
than closures.
from httprouter.
I think matching the method signature with the standard http.Handler interface would be ideal. Possibly when there are parameters you could do something similar to other packages and use the querystring with keys like ":querystringkey" ?
from httprouter.
We implemented this on top of httprouter here: https://github.com/nbio/hitch
It uses per-request contexts from: https://github.com/nbio/httpcontext
from httprouter.
I like it the way it is. With closures, it's already plenty flexible enough IMHO.
from httprouter.
I'd love this implemented too.
from httprouter.
It is possible to wrap request body as interface.
Allocation could be avoided if parameters would be built with each route on initialization
See the example:
package vanilla
// based on https://github.com/nbio/httpcontext
// authored by http://nb.io https://github.com/nbio.
// MIT License
import (
"io"
"net/http"
)
// Param is a single URL parameter, consisting of a key and a value.
type Param struct {
Key string
Value string
}
// Params is a Param-slice, as returned by the router.
// The slice is ordered, the first URL parameter is also the first slice value.
// It is therefore safe to read values by the index.
type Params []Param
// ByName returns the value of the first Param which key matches the given name.
// If no matching Param is found, an empty string is returned.
func (ps Params) ByName(name string) string {
for i := range ps {
if ps[i].Key == name {
return ps[i].Value
}
}
return ""
}
// Parameters returns all path parameters for given
// request.
//
// If there were no parameters and route is static
// then nil is returned.
func Parameters(req *http.Request) Params {
return parameterized(req).get()
}
type paramReadCloser interface {
io.ReadCloser
get() Params
set(Params)
}
type parameters struct {
io.ReadCloser
all Params
}
func (p *parameters) get() Params {
return p.all
}
func (p *parameters) set(params Params) {
p.all = params
}
func parameterized(req *http.Request) paramReadCloser {
p, ok := req.Body.(paramReadCloser)
if !ok {
p = ¶meters{ReadCloser: req.Body}
req.Body = p
}
return p
}
And usage example would be:
router.GET("/all/*node", http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
fmt.Fprintf(w, "got var: "+Parameters(req).ByName("node"))
}))
from httprouter.
@tj guess you should be very excited to see this https://github.com/DATA-DOG/fastroute have a look at Router interface
maybe it is not the right place to add such a link, but well, worth it..
from httprouter.
Related Issues (20)
- Run into 404 instead of graphql playground when using gqlgen with httprouter HOT 1
- How to use this custom middleware HOT 1
- Matching multiple named parameters HOT 1
- ServeFiles not able to serve static files HOT 2
- How can I receive multiple parameters in GET request? HOT 3
- Is it possible to bind one router to some path in another router? HOT 2
- is it possible to get the registered path? HOT 7
- panic: '/hello/:name' in new path '/hello/:name' conflicts with existing wildcar
- Why make catchAll form so special HOT 2
- httprouter.ParamsWithContext(r.Context()) is returning []
- Question: will re-registering a handler work properly?
- Fails with "embed" package HOT 1
- Dump all registered routes HOT 3
- Improve longestCommonPrefix and add unit tests HOT 1
- Question: How can I embed swagger UI? HOT 2
- Feature Request: Support multi-wildcard names for same tree branch HOT 1
- panic: path must begin with '/' in path 'GET'
- List all registered endpoint httprouter
- what is the empty path node used for? HOT 1
- Unable to load jsx files because "file.jsx was blocked because of a disallowed MIME type text/plain" HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from httprouter.