Angel3 Developer Guide
  • README
  • Foreword
  • Tutorial
    • Getting Started
    • Minimal Setup
  • Command Line Interface
    • Setup
  • Templates and Views
    • Server Side Rendered Views
    • JAEL3
      • About
      • Basics
      • Custom Elements
      • Strict Resolution
      • Directive: declare
      • Directive: for-each
      • Directive: extend
      • Directive: if
      • Directive: include
      • Directive: switch
  • Authentication
    • About
    • Strategies
    • Local
  • Databases
    • Object Relational Mapping (ORM)
      • About
      • Basic Functionality
      • Relations
      • Migrations
      • PostgreSQL
    • NoSQL
  • Extensions and Plugins
    • Using Plug-ins
    • Writing a Plugin
  • Under the hood
    • Basic Routing
    • Requests & Responses
    • Request Lifecycle
    • Dependency Injection
    • Middleware
    • Controllers
    • Parsing Request Bodies
    • Serialization
    • Service Basics
    • Testing
    • Error Handling
    • Pattern Matching and Parameter
  • Angel Framework Migration
    • Angel 2.x.x to Angel3
      • Rationale - Why a new Version?
      • Framework Changelog
      • 3.0.0 Migration Guide
    • Angel 1.x.x to 2.x.x
      • Framework Changelog
      • 2.0.0 Migration Guide
  • Packages
    • Authentication
    • CORS
    • Database-Agnostic Relations
    • Configuration
    • Databases
      • ORM
      • MongoDB
      • JSON File-based
      • RethinkDB
    • Templates and Views
      • Jael template engine
      • Mustache Templates
      • compiled_mustache-based engine
      • html_builder-based engine
      • Markdown template engine
      • Using Angel with Angular
    • Hot Reloading
    • Pagination
    • Polling
    • Production Utilities
    • REST Client
    • Reverse Proxy
    • Router
    • Serialization
    • Service Seeder
    • Static Files
    • Security
    • Server-sent Events
    • shelf Integration
    • Task Engine
    • User Agents
    • Validation
    • Websockets
  • Resources
    • Dependency Injection Patterns
    • Example Projects
    • YouTube Tutorials
    • Ecosystem
Powered by GitBook
On this page
  • Routing
  • Route Parameters
  • Parsing Parameters
  • RegExp Routes
  • Sub-Apps
  • Route Groups
  • Extended Documentation
  • Next Up

Was this helpful?

  1. Under the hood

Basic Routing

PreviousUnder the hoodNextRequests & Responses

Last updated 3 years ago

Was this helpful?

Routing

There is only one method responsible for adding routes to your application:

app.addRoute('<method>', '<path>', requestHandler);

However, the following methods are available for convenience, and are the ones you will use most often. Each method's name responds to an HTTP request method. For example, a route declared with app.get(...), will respond to HTTP GET requests.

app.get('<path>', requestHandler);
app.post('<path>', requestHandler);
app.patch('<path>', requestHandler);
app.delete('<path>', requestHandler);

Your requestHandler should take the following form:

typedef FutureOr<dynamic> RequestHandler(RequestContext req, ResponseContext res);

Route paths do not have to begin with a forward slash, as leading and trailing slashes are stripped from route paths internally.

Route Parameters

Say you're building an API, or an MVC application. You typically want to serve the same view template on multiple paths, corresponding to different ID's. You can do this as follows, and all parameters will be available via req.params:

app.get('/todos/:id', (req, res) async => {'id': req.params['id']});

Remember, route parameters must be preceded by a colon (':'). Parameter names must start with a letter or underscore, optionally followed by letters, underscores, or numbers. Parameters will match any character except a forward slash ('/') in a request URI.

Examples:

  • :id

  • :_hello

  • :param123

  • info_about_:username

Parsing Parameters

With a special syntax, you can build routes that automatically parse parameters as ints or doubles:

app
  ..get('/add/int:number', (req, res) => req.params['number'] * 3)
  ..get('/multiply/double:number', (req, res) => req.params['number'] * 5.0);

RegExp Routes

Route parameters can also have custom regular expressions, to remove the requirement of manual parsing. Simply enclose the regular expression in a set of parentheses following the parameter's name.

app.get(r'/number/:num([0-9]+(\.[0-9])?)', ...);

Sub-Apps

You can mount routers, or use entire sub-apps.

var app = Angel();
app.get('/', 'Hello!');

var subRouter = Router()..get('/', 'Subroute');
app.mount('/sub', subApp);
// Now, you can visit /sub and receive the message "Subroute"

var subApp = Angel()..get('/hello', 'world');
app.use('/api', subApp);

// GET /api/hello returns "world"

Route Groups

Routes can also be grouped together. Route parameters will be applied to sub-routes automatically. Route groups can be nested as well.

app.group('/user/:id', (router) {
  router
    ..get('/messages', (String id) => fetchUserMessages(id))
    ..group('/nested', ...);
});

Extended Documentation

Next Up

Your requestHandler can return any Dart value, whether a function, or an object. See the pages for detailed documentation.

For more documentation on the router, see . has no dart:io or dart:mirrors dependency, and it also supports browser use (both hash and push state).

Learn how let you reuse functionality across your entire routing setup.

Angel3 Route Repository
angel3_route
Requests and Responses
Routing
Route Parameters
Parsing Parameters
RegExp Routes
Mounting and Sub-Apps
Route Groups
Extended Documentation
Next Up...
Requests and Responses