Controlador
Um @Controller() no Vaden define uma classe que lida com rotas HTTP. É um dos blocos de construção fundamentais do framework.
O valor passado para @Controller('/caminho') define um prefixo de rota aplicado a todos os métodos naquela classe. Por exemplo:
('/users')
class UserController {
('/all')
String getAll() => 'Listing all users';
}
Isso será mapeado para /users/all no servidor HTTP.
Agrupar rotas com um prefixo comum ajuda a manter sua aplicação modular e organizada.
('/hello')
class HelloController {
final HelloService helloService;
helloController(this.helloService);
('/ping')
Response ping() => Response.ok(helloService.ping());
}
- O caminho base
/hellose aplica a todos os métodos dentro. - Injeção por construtor injeta automaticamente
HelloServicese estiver registrado.
Tipos de Retorno
Métodos de controlador no Vaden suportam múltiplos tipos de retorno. O Vaden adaptará automaticamente a resposta dependendo do que você retornar:
ResponseouFuture<Response>→ Usado diretamente.StringouList<int>→ Enviado como corpo simples.- Um objeto marcado com
@DTO()→ Serializado para JSON. - Uma lista de
@DTO()→ Serializada como array JSON.
('/text')
String hello() => 'Hello World';
('/json')
UserDTO getUser() => UserDTO('admin');
('/list')
List<UserDTO> getUsers() => [UserDTO('a'), UserDTO('b')];
('/custom')
Future<Response> advanced() async => Response.ok('Manual');
Manipuladores de Métodos HTTP
Vaden suporta os seguintes decoradores de método:
@Get()@Post()@Put()@Delete()@Head()@Options()
@Param and @Query
Esses decoradores extraem dados do caminho da URL ou da string de consulta.
// http://localhost:8080/user/2
('/user/<id>')
String getUser(('id') int id) => 'User $id';
// http://localhost:8080/search?term=Text
('/search')
String search(('term') String term) => 'Searching $term';
Você pode omitir o nome do parâmetro na anotação:
('/product/<id>')
String getProduct(() String id) => 'Product $id';
Neste caso, o nome da variável (id) será usado como chave.
Tanto @Param quanto @Query suportam os seguintes tipos:
Stringintdoublebool
Se um parâmetro for opcional, você pode declará-lo com um tipo anulável:
('/search')
Response search(('term') String? term) => ...;
Isso indica ao Vaden para não lançar um erro se o valor estiver ausente.
Usando @Body com DTOs
O decorador @Body() vincula o corpo JSON da requisição a um objeto Dart.
Apenas classes anotadas com @DTO() são permitidas:
()
class Credentials {
final String username;
final String password;
Credentials(this.username, this.password);
}
...
('/login')
String login(() Credentials credentials) => credentials.username;
Internamente, o Vaden usa o motor DSON para converter o corpo da requisição no seu DTO.
Roteamento Curinga
Use @Mount() para endpoints curinga — útil para casos avançados como WebSockets ou manipuladores de proxy:
('/socket')
class SocketController {
('/chat')
Response handle(Request request) {
return websocketHandler(request);
}
}