Rotas em ASP.NET MVC
Você que utiliza ASP.NET MVC já se perguntou algum dia como seu browser consegue chamar métodos dos seus controladores? Já ficou curioso a respeito de por que as URLs da sua aplicação funcionam da forma que funcionam? Por que, afinal, um nome que nada tem a ver com minha página faz com que ela seja carregada nos navegadores dos meus usuários? E se eu quiser definir ainda outros endereços para minhas páginas ou ações? Chegaremos à luz de tudo isto através do mecanismo de roteamento do ASP.NET.
Uma das características básicas dos serviços REST, por exemplo, é que todo recurso é mapeado por uma URL (Uniform Resource Locator). É através dessa URL que sabemos como chegar até este recurso e executar uma determinada ação.
Cada URL identifica um recurso específico e tem a seguinte sintaxe: [scheme]://[host]:[port]/[path][?query], em que cada fragmento tem uma representação e funcionalidade, detalhadas abaixo:
- Scheme: Identifica o protocolo que será utilizado para fazer a requisição, podendo ser: HTTP, HTTPS, FTP, etc.
- Host: O Host define o nome (fornecido pelo DNS) ou o endereço IP do servidor.
- Port: Opção para definir o número da porta (no destino) que será utilizada para receber a requisição. Se omitido, utilizará a porta padrão do protocolo, que no HTTP é a porta 80, no HTTPS a porta 443, etc.
- Path: Este é o fragmento da URL que identifica o recurso em si. É através dele que apontamos qual dos recursos desejamos acessar naquele servidor.
- Query: Informação opcional que pode ser encaminhada para o serviço, fornecendo parâmetro(s) adicional(is) para o processamento da requisição. Um exemplo clássico é a inclusão do identificador do recurso que está sendo solicitado.
Até pouco tempo, as URLs eram indecifráveis para o usuário final, pois geralmente mapeavam um recurso para um arquivo físico da árvore de diretórios do servidor, e por isso, acabavam por vezes sendo muito extensas e/ou não faziam muito sentido para quem as lesse. Aos poucos, elas foram ficando cada vez mais legíveis, mais amigáveis, facilitando o entendimento do usuário e favorecendo uma leitura melhor dos recursos que elas representam. Outro grande benefício desta evolução das URLs diz respeito ao SEO (Search Engine Optimization), onde os buscadores consideram as palavras encontradas na URL para otimizar a pesquisa.
Durante o desenvolvimento do ASP.NET MVC, a Microsoft criou um mecanismo de roteamento capaz de mapear URLs quaisquer para endereços dentro do servidor, sejam eles físicos, através do MapPageRoute (que discutiremos na parte 2 deste texto) ou virtuais, pelo método MapRoute. Esta ferramenta, a princípio, seria uma funcionalidade própria do framework MVC. O mecanismo é capaz de interpretar a requisição (URL) que está chegando pelo navegador e, baseado em uma tabela de regras, responder com o arquivo requisitado caso a regra registrada aponte para um endereço físico, ou o serviço, a classe e o método a ser executado caso a regra mapeie para um endereço virtual. Mas este recurso se mostrou tão útil que, antes mesmo do lançamento oficial do ASP.NET MVC, a Microsoft fez com que ele fosse desacoplado e levado para o core do ASP.NET. Com isso, o roteamento passou a ser utilizado tanto pelo ASP.NET MVC, quanto pelos Web Forms e também pelo ASP.NET Web API. (bem cm)
Sumário
Mas como funciona essa tabela de rotas?
Quando você roda uma aplicação pela primeira vez, ela lança um evento denominado Application_start(), definido no arquivo Global.asax. É no código deste evento que o método de criação da tabela de rotas, dentre outros, é invocado.
No método acima definimos o esquema de roteamento padrão que será utilizado pela nossa aplicação. De acordo com ele, estamos dizendo a ela que toda requisição que chegar através da URL deverá ser traduzida da seguinte forma:
O primeiro segmento indica qual o Controller, o segundo segmento informa qual Action deste Controller deve ser chamada e o terceiro segmento, se informado, aponta o identificador do recurso acessado nesta Action. Além disso, definimos quais os valores padrão que os segmentos deverão assumir caso não sejam informados pelos usuários.
Exemplificando:
Lembram da sintaxe que foi mostrada logo no começo do texto? Para evitar que você volte lá no início, vamos dar uma forcinha e mostra-la aqui novamente: [scheme]://[host]:[port]/[path][?query]. É no fragmento [path] que estamos interessados aqui.
Agora imaginem que é feita a seguinte entrada no browser: http://suaaplicacao.com/admin/listarUsuarios.
Note que o primeiro segmento do ‘path’ contém a palavra ‘admin’ e o segundo segmento contém a palavra ‘listarUsuarios’. Sendo assim, de acordo com a regra que definimos na nossa rota padrão, nossa aplicação vai tentar encontrar a Action ‘listarUsuarios’ no Controller ‘adminController’.
Ainda considerando a regra padrão, o usuário poderia também fazer a seguinte chamada: http://suaaplicacao.com/admin/listarUsuarios/345. Neste caso, a aplicação deverá mapear o terceiro segmento para o ‘ID’ do usuário a ser listado na Action ‘listarUsuarios’ do Controller ‘adminController’.
Explorando os valores padrão desta rota, se um determinado usuário fizesse a seguinte chamada: http://suaaplicacao.com, a aplicação deveria mapear a entrada para a Action ‘Index’ do Controller ‘HomeController’, obedecendo aos valores ‘default’ definidos.
Por fim, se o usuário fizesse a chamada http://suaaplicação.com/admin, o serviço de rotas deveria mapear para a ação “Index” do controlador “adminController”, preenchendo a parte que foi passada pela requisição com seu valor e assumindo o valor padrão para as demais partes.
Certo, você deve ter entendido por que sua aplicação funciona da forma que funciona. A rota padrão do ASP.NET MVC define um mapeamento virtual, ou seja, ela não leva as URLs para arquivos físicos do sistema e sim para ações, métodos de controladores. Todas as URLs mágicas que redirecionam para o lugar certo, dependendo apenas dos nomes de seus controladores e ações, são possíveis com somente a rota padrão.
Entender como funciona é legal, é claro, mas agora você deve estar interessado em mais uma coisa: como eu utilizo esta ferramenta do meu jeito? Como eu faço para decidir para onde as URLs serão mapeadas? Para aprendermos isto, basta dar uma olhada aqui na segunda parte.
Por: Daniel Prata e José Vicente
Revisão: Jéssica Saliba
Desenvolvimento de Software
Confira outros artigos
Testes end-to-end: sucesso na implementação da automação
Hoje, como você garante a entrega de valor, a confiabilidade e a eficiência do seu projeto? Com o intuito de responder a essa questão crucial, uma das melhores respostas é a automação de testes end-to-end. Muitas pessoas, principalmente nossos clientes, tendem a imaginar que automação de testes é apenas mais um tipo de teste de […]
Desenvolvimento de Software
Mecanismos de Acompanhamento no Desenvolvimento de Software
O uso de mecanismos de acompanhamento é imprescindível no mundo do desenvolvimento de software e pode potencializar a eficiência digital. O acompanhamento efetivo das operações é fundamental para garantir a entrega de soluções digitais de sucesso. Na nossa empresa, utilizamos uma metodologia única, o dti evolve, que incorpora inteligência artificial (IA) para acelerar nosso processo de […]
Desenvolvimento de Software
Eficiência digital com copilot: um caso de uso do GitHub
Em um mundo em constante evolução tecnológica, otimizar o tempo e potencializar a eficiência digital se torna cada vez mais crucial. Portanto, vamos apresentar alguns experimentos que estão sendo implementados com o Git Hub Copilot em busca de maior eficiência digital. Certamente quem nos acompanha sabe que estamos experimentando e introduzindo as melhores ferramentas de […]
Desenvolvimento de Software