Rotas e HttpRoutes
Defina endpoints funcionalmente.
Rotas e HttpRoutes é uma aula grátis de Scala for Backend Engineering & Functional Programming no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Scala for Backend Engineering & Functional Programming, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Scala for Backend Engineering & Functional Programming inclui 4 aulas no total.
O que é http4s
http4s é uma biblioteca HTTP puramente funcional para Scala, criada sobre cats-effect e fluxos fs2. Requisições e respostas são valores imutáveis, e os efeitos são capturados em um tipo de efeito polimórfico F[_], como IO.
Em vez de modificar um servlet, você descreve um serviço HTTP como uma função de uma requisição para uma resposta opcional com efeitos.
O tipo HttpRoutes
A abstração central é HttpRoutes[F], um alias para Kleisli[OptionT[F, *], Request[F], Response[F]]. OptionT modela uma rota que pode não corresponder, retornando nenhuma resposta.
Você raramente escreve essa assinatura manualmente. Em vez disso, crie rotas com o construtor HttpRoutes.of e uma função parcial.
import cats.effect.IO
import org.http4s._
import org.http4s.dsl.io._
val routes: HttpRoutes[IO] = HttpRoutes.of[IO] {
case GET -> Root / "hello" => Ok("hi")
}A DSL do http4s
A importação da DSL org.http4s.dsl.io._ traz extratores de padrões como GET, Root e o separador de caminho /, além de construtores de resposta como Ok e NotFound.
Uma rota é uma PartialFunction[Request[F], F[Response[F]]]. Os casos que não correspondem simplesmente passam para o próximo.
import org.http4s.dsl.io._
HttpRoutes.of[IO] {
case GET -> Root => Ok("root")
case GET -> Root / "ping" => Ok("pong")
}Correspondendo a caminhos
Os padrões de caminho são lidos da esquerda para a direita. Root é a barra inicial, e cada / "segment" corresponde a um segmento literal do caminho.
A seta -> separa o método HTTP do caminho. Portanto, GET -> Root / "users" corresponde a GET /users.
HttpRoutes.of[IO] {
case GET -> Root / "users" => Ok("all users")
case GET -> Root / "users" / "me" => Ok("current user")
}Variáveis de caminho
Um elemento de ligação minúsculo e simples em um caminho captura esse segmento como uma String. Aqui, id associa qualquer valor que apareça depois de /users/.
Os segmentos capturados são sempre cadeias de caracteres; você mesmo os converte para tipos mais ricos ou usa os objetos extratores mostrados a seguir.
HttpRoutes.of[IO] {
case GET -> Root / "users" / id =>
Ok(s"user $id")
}Extratores de caminho tipados
O http4s oferece extratores como IntVar e LongVar, que só correspondem quando o segmento pode ser convertido para esse tipo. Um segmento não numérico faz o caso passar para o próximo.
Você pode definir extratores personalizados com um unapply para tipos do domínio, como UUIDs.
HttpRoutes.of[IO] {
case GET -> Root / "users" / IntVar(id) =>
Ok(s"numeric user $id")
}Correspondência de métodos
O extrator de método antes de -> pode ser qualquer um entre GET, POST, PUT, DELETE, PATCH e outros. O mesmo caminho com métodos diferentes torna-se uma série de casos separados.
Se um caminho corresponder, mas o método não, o http4s responderá automaticamente com 405 Method Not Allowed.
HttpRoutes.of[IO] {
case GET -> Root / "items" => Ok("list")
case POST -> Root / "items" => Created("made")
case DELETE -> Root / "items" / IntVar(i) => NoContent()
}Combinando rotas
Como HttpRoutes[F] forma um SemigroupK, você compõe vários grupos de rotas com o operador <+>. O primeiro grupo que produz uma resposta vence.
Isso permite dividir as rotas por funcionalidade em valores separados e mesclá-las em um único lugar.
import cats.syntax.semigroupk._
val all = userRoutes <+> itemRoutes <+> healthRoutesDe rotas para HttpApp
Um servidor precisa de uma função total, não de uma parcial. HttpRoutes[F] é convertido em HttpApp[F] com .orNotFound, que fornece um 404 quando nenhuma rota corresponde.
HttpApp[F] é Kleisli[F, Request[F], Response[F]] — sempre retornando uma resposta.
import org.http4s.HttpApp
val app: HttpApp[IO] = routes.orNotFoundEnvolvendo com middleware
Middlewares são funções HttpRoutes[F] => HttpRoutes[F] (ou sobre HttpApp). Eles envolvem um serviço para adicionar logging, CORS, gzip ou autenticação sem alterar a lógica das rotas.
Exemplos integrados incluem Logger, CORS e GZip de org.http4s.server.middleware.
import org.http4s.server.middleware.Logger
val logged = Logger.httpApp(logHeaders = true, logBody = false)(app)Parâmetros de consulta nas rotas
Os parâmetros de consulta são correspondidos com objetos comparadores que estendem QueryParamDecoderMatcher. Eles aparecem depois de um :? no padrão do caminho.
Use OptionalQueryParamDecoderMatcher para parâmetros que podem estar ausentes, produzindo um Option.
object NameParam extends QueryParamDecoderMatcher[String]("name")
HttpRoutes.of[IO] {
case GET -> Root / "hi" :? NameParam(n) => Ok(s"hi $n")
}Verificação rápida
Teste sua compreensão sobre a composição de rotas.
Recapitulação
Você criou rotas com HttpRoutes.of e a DSL, fez correspondência de métodos e caminhos, capturou variáveis com IntVar e comparadores e compôs grupos com <+>.
As rotas são parciais; .orNotFound as transforma em um HttpApp total, e os middlewares envolvem serviços para tratar interesses transversais.
Aprenda Scala com um tutor de IA — grátis
Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.
- Cursos
- 39
- Aulas
- 143
Perguntas Frequentes
A aula “Rotas e HttpRoutes” é grátis?
Sim — o texto completo de “Rotas e HttpRoutes” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Scala for Backend Engineering & Functional Programming, atualize para CoddyKit PRO. O curso de Scala for Backend Engineering & Functional Programming inclui 4 aulas no total.
O que vou aprender em “Rotas e HttpRoutes”?
Defina endpoints funcionalmente. Você pratica Scala for Backend Engineering & Functional Programming com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Scala for Backend Engineering & Functional Programming?
Nenhuma experiência prévia é necessária. Scala for Backend Engineering & Functional Programming no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.
Quanto tempo leva a aula “Rotas e HttpRoutes”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Scala for Backend Engineering & Functional Programming?
Sim. Cada aula de Scala for Backend Engineering & Functional Programming inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Rotas e HttpRoutes
- Solicitações e respostas
- Endpoints JSON
- Disponibilizando o aplicativo