# Routes
Routes are the core of every web application. They are the endpoints that the client will interact with.
Serinus provides a simple way to define routes using the `Route` class. You can decide if defining a custom class that extends the `Route` class or use the factory constructor to create one.
```dart
import 'package:serinus/serinus.dart';
class MyController extends Controller {
MyController({super.path = '/'}) {
on(Route.get('/'), (context) async {
return 'Hello World';
});
}
}
```
## Using the factory constructors
The factory constructors are a more concise way to define routes. You can use them to define routes without creating a custom class.
```dart
import 'package:serinus/serinus.dart';
class MyController extends Controller {
MyController({super.path = '/'}) {
on(Route.get('/'), (context) async {
return 'Hello World';
});
}
}
```
| Factory Constructor | Method | Description |
|---------------------|--------|-------------|
| `Route.get` | GET | Defines a route that only accepts GET requests. |
| `Route.post` | POST | Defines a route that only accepts POST requests. |
| `Route.put` | PUT | Defines a route that only accepts PUT requests. |
| `Route.delete` | DELETE | Defines a route that only accepts DELETE requests. |
| `Route.patch` | PATCH | Defines a route that only accepts PATCH requests. |
| `Route.all` | ALL | Defines a route that accepts all HTTP methods. (Usually used as a fallback route) |
## Create a custom route
You can create a custom route by extending the `Route` class.
```dart
import 'package:serinus/serinus.dart';
class MyRoute extends Route {
MyRoute(String path): super({path: path, method: HttpMethod.get});
}
```
While this approach can seem more verbose, extending the `Route` class allows you to add lifecycle hooks and other custom logic to your routes.
## Route-scoped Hooks
You can add hooks to your routes by add it using the `HooksContainer` available in the `Route` class.
```dart
import 'package:serinus/serinus.dart';
class MyRoute extends Route {
MyRoute(String path): super({path: path, method: HttpMethod.get}) {
hooks.add(TestHook());
}
}
```
## Metadata
You can add metadata to your routes by using the `metadata` parameter in the route constructor.
This is available in both the factory constructor and the custom route class.
```dart
import 'package:serinus/serinus.dart';
class MyController extends Controller {
MyController({super.path = '/'}) {
on(Route.get('/', metadata: [GuardMetadata()]), (context) async {
return 'Hello World';
});
}
}
```
If you want to know more about metadata, please refer to the [metadata](/metadata) page.