Scala for Backend Engineering & Functional Programming · Aula

Rotas e HttpRoutes

Defina endpoints funcionalmente.

Aula 1 de 413 etapas

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 <+> healthRoutes

De 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.orNotFound

Envolvendo 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.

Grátis para começar

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

  1. Rotas e HttpRoutes
  2. Solicitações e respostas
  3. Endpoints JSON
  4. Disponibilizando o aplicativo
← Voltar para Scala for Backend Engineering & Functional Programming