NormalizePath class final

Makes /todos and /todos/ mean the same thing.

The router treats them as different paths on purpose — a route table that silently matched both would hide a duplicate. This layer decides the question once, at the edge, instead of every route declaring itself twice.

final app = Router()
  ..layer(const NormalizePath())
  ..merge(routes);

Two ways to settle it, and the choice is not cosmetic:

  • Rewrite (the default) serves the normalized path directly. One request, one response, and the URL in the address bar is left alone.
  • Redirect answers 308 and sends the client to the canonical form. It costs a round trip and it collapses two URLs into one for caches, logs, and search engines — which is the reason to pay for it.

The root path is never touched: / is already canonical, and stripping its slash would leave an empty path nothing can match.

A layer covers everything the router it is on answers, 404s included, so this works at the top level or scoped to a prefix:

// The whole application.
final app = Router()
  ..layer(const NormalizePath())
  ..nest('/api', api);

// Only `/api`. Useful when the other half has URLs you must not rewrite —
// a webhook whose signature covers the exact path, say.
final api = Router()
  ..layer(const NormalizePath())
  ..route('/notes', get(listNotes));
Implemented types

Constructors

NormalizePath({TrailingSlash slash = TrailingSlash.strip})
Normalizes by rewriting the request.
const
NormalizePath.redirecting({TrailingSlash slash = TrailingSlash.strip})
Normalizes by redirecting the client to the canonical form.
const

Properties

hashCode → int
The hash code for this object.
no setterinherited
redirect → bool
Whether to redirect rather than rewrite.
final
runtimeType → Type
A representation of the runtime type of the object.
no setterinherited
slash → TrailingSlash
Which form is canonical.
final

Methods

noSuchMethod(Invocation invocation) → dynamic
Invoked when a nonexistent method or property is accessed.
inherited
toMiddleware() → Middleware
Builds the shelf middleware this value configures.
override
toString() → String
A string representation of this object.
inherited

Operators

operator ==(Object other) → bool
The equality operator.
inherited