Giter VIP home page Giter VIP logo

Comments (11)

julienschmidt avatar julienschmidt commented on May 5, 2024

Intended.
The router matches prefixes, not the complete route at once. /:some and /otherthing conflict obviously. It doesn't matter that no handler is registered for /:some only.

The intention is, that there is only one or none possible route for any prefix when matching incoming requests. But if someone requests /otherthing both the variable-length parameter /:some and the static path /otherthing would match.

from httprouter.

codepushr avatar codepushr commented on May 5, 2024

I have the same issue. Take the following example:

a.mux.POST("users/:id/verify", user.Verify)
a.mux.POST("users/activated", user.GetActivatedUsers)

The first verifies one special user while the second returns a collection of activated users based on the request payload.

This is possible with many modern routers so the decision really surprised me.

from httprouter.

nucleartide avatar nucleartide commented on May 5, 2024

I have the same problem as @CodingRogue. Surprisingly, we're both doing something user-related..

users.GET("/new")
users.GET("/:id/edit")

Something like /users/edit/:id instead of /users/:id/edit would work, but I'd really prefer /users/:id/edit.

from httprouter.

codepushr avatar codepushr commented on May 5, 2024

I'm afraid this will happen quite often in more complex rest apis. Is there any solution or workaround except switching routers?

from httprouter.

nucleartide avatar nucleartide commented on May 5, 2024

You could probably embed httprouter in a new struct and refine httprouter's methods to support the routes above. But I ended up just replacing httprouter with gorilla/pat. gorilla/pat also has regex matching so you can match numbers.

from httprouter.

codepushr avatar codepushr commented on May 5, 2024

I will check out pat then, thanks.

from httprouter.

emilgpa avatar emilgpa commented on May 5, 2024

the routes /users/:id/verify and /users/activated collide. I guess that you have a route like /users/:id to view the profile of user but, what happen if a username is named "activated"? goes to route /users/activated or /users/:id (:id would be "activated")?

httprouter encourages the good route design.

For fix your routes, should look like:

a.mux.POST("user/:id", user.Profile)
a.mux.POST("user/:id/verify", user.Verify)
a.mux.POST("users", user.GetAll)
a.mux.POST("users/activated", user.GetActivatedUsers)

from httprouter.

codepushr avatar codepushr commented on May 5, 2024

I can see your point but this route design is not REST compatible. I need to have the same resource identifier reachable through all necessary http verbs (GET, POST, PUT, PATCH, DELETE...).

from httprouter.

emilgpa avatar emilgpa commented on May 5, 2024

But each http verb must do things differently from the rest...

from httprouter.

bradrydzewski avatar bradrydzewski commented on May 5, 2024

I hit the same issue. I think this is a pretty common use case, and something I would love to see gin accommodate. You can see similar patterns in GitHub, Twitter, Facebook, etc:

github.com/
github.com/issues
github.com/:user
github.com/:user/:repo

twitter.com/mentions
twitter.com/i/notifications
twitter.com/:username

www.facebook.com/events/upcoming
www.facebook.com/messages/
www.facebook.com/:username

from httprouter.

julienschmidt avatar julienschmidt commented on May 5, 2024

#73

from httprouter.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.