Creative Bracket

Build Web APIs with Aqueduct #2

In this article we will look at routing in further detail, building an endpoint capable of performing CRUD(create, read, update, delete) operations. We will make use of Router and Controller classes in the handling of requests made to our endpoint.

What is a Router?

Routers capture the request by path and forwards it to a Controller using a link method for resolution or a linkFunction to implement middleware functionality to handle the request.

Here’s what it looks like:

final router = Router();

router.route('/path-1').link(() => Path1Controller());
router.route('/path-2').linkFunction((Request req) async {
  return Response.ok('Hello, World!');

The path is passed as an argument when route() is invoked, and can also accept route parameters:

router.route('/path-2/[:name]').linkFunction(...); // wrapping in square brackets means its optional

So with this snippet whatever is passed in the path segment after /path-1/ is captured in name path variable:

router.route('/path-1/:name').linkFunction((request) async {
  final name = request.path.variables['name'];
  return Response.ok('Hello, $name');

See how routers and controllers work in the video.

Subscribe to my YouTube channel for more videos covering various aspects of full-stack web development with Dart.

Like, share and follow me 😍 for more content on Dart.

Continue watching

Further reading

Jermaine Oppong

Hello 👋, I show programmers how to build full-stack web applications with the Dart SDK. I am passionate about teaching others, having received tremendous support on sites like and for my articles covering various aspects of the Dart language and ecosystem.

Useful learning materials