Solicitações e respostas
Leia a entrada e retorne a saída.
Solicitações e respostas é uma aula grátis de Scala for Backend Engineering & Functional Programming no CoddyKit. Esta é a aula 2 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.
A requisição como valor
No http4s, uma Request[F] é um valor imutável que contém o método, a URI, os cabeçalhos, a versão HTTP e um corpo em fluxo. Você a inspeciona com acessores puros e nunca a modifica no local.
Para alterar uma requisição, produza uma cópia usando withHeaders, withUri ou combinadores semelhantes.
val r: Request[IO] = Request[IO](
method = Method.GET,
uri = uri"/health"
)O corpo em fluxo
O corpo de uma requisição ou resposta é um fs2.Stream[F, Byte]. Ele é consumido de forma preguiçosa e com efeitos, portanto grandes cargas úteis não precisam permanecer inteiramente na memória.
Normalmente, você não acessa os bytes brutos; um EntityDecoder cuida da decodificação para você.
// raw access (rarely needed)
val bytes: fs2.Stream[IO, Byte] = request.bodyDecodificando o corpo
Um EntityDecoder[F, A] sabe transformar o fluxo do corpo em um A. Chame req.as[A] para decodificar; isso retorna F[A] e faz o efeito falhar quando o corpo está malformado.
Existe um decodificador integrado para String; os mais avançados vêm dos módulos JSON.
HttpRoutes.of[IO] {
case req @ POST -> Root / "echo" =>
req.as[String].flatMap(body => Ok(body))
}Associando a requisição
Para acessar o objeto da requisição dentro de um caso, associe-o com @. Aqui, req nomeia a requisição inteira, enquanto o padrão ainda corresponde ao método e ao caminho.
Sem o elemento de ligação, você tem apenas as partes desestruturadas e não pode ler o corpo nem os cabeçalhos.
HttpRoutes.of[IO] {
case req @ PUT -> Root / "name" =>
req.as[String].flatMap(n => Ok(s"set $n"))
}Lendo cabeçalhos
Os cabeçalhos ficam em request.headers. Use headers.get[H] com um modelo de cabeçalho tipado ou headers.get(CIString("X-Custom")) para nomes arbitrários.
Cabeçalhos tipados, como Authorization e Content-Type, analisam e validam seus valores para você.
import org.http4s.headers.Authorization
val auth: Option[Authorization] =
request.headers.get[Authorization]Criando respostas
Os construtores de resposta da DSL, como Ok, Created e NotFound, são funções que retornam F[Response[F]]. Passar um argumento define o corpo por meio de um EntityEncoder.
Cada construtor corresponde a um código de status, portanto Created(...) produz 201.
Ok("all good") // 200
Created("made it") // 201
NotFound("missing") // 404Códigos de status diretamente
Para um status sem um construtor conveniente, ou para personalizá-lo, construa uma Response[F] com um Status explícito e encadeie withEntity.
Isso oferece controle total sobre o status, os cabeçalhos e o corpo em uma única expressão.
import org.http4s.{Response, Status}
Response[IO](Status.Accepted)
.withEntity("queued")
.pure[IO]Codificando corpos
Um EntityEncoder[F, A] serializa um valor no corpo da resposta e define o Content-Type. Codificadores para String e bytes são integrados; os codificadores JSON vêm do Circe.
Quando você passa um valor para Ok(value), o http4s procura implicitamente o codificador.
// String encoder is implicit; sets text/plain
val resp: IO[Response[IO]] = Ok("plain text body")Definindo cabeçalhos da resposta
Adicione cabeçalhos passando-os como argumentos extras para um construtor ou encadeie .map(_.putHeaders(...)) no efeito da resposta.
Modelos de cabeçalho tipados garantem valores formatados corretamente, como um cabeçalho Location em um 201 Created.
import org.http4s.headers.Location
Created("ok").map(_.putHeaders(
Location(uri"/items/42")
))Lidando com falhas de decodificação
req.as[A] faz o efeito F falhar quando o corpo não pode ser decodificado. Use req.attemptAs[A].value para obter um F[Either[DecodeFailure, A]] e responder com 400 no lado esquerdo.
Isso mantém explícito e total o tratamento de entradas malformadas.
req.attemptAs[String].value.flatMap {
case Right(b) => Ok(b)
case Left(_) => BadRequest("bad body")
}Cookies e redirecionamentos
Defina cookies com response.addCookie(ResponseCookie(name, value)). Para redirecionamentos, use um construtor 3xx e um cabeçalho Location.
SeeOther(Location(uri)) executa um 303, a resposta idiomática de redirecionamento após uma operação POST.
import org.http4s.headers.Location
SeeOther(Location(uri"/login"))
.map(_.addCookie("sid", "abc123"))Verificação rápida
Reflita sobre uma decodificação segura do corpo.
Recapitulação
Requisições e respostas são valores imutáveis com corpos fs2 em fluxo. Você decodifica com as/attemptAs por meio de EntityDecoder e codifica com EntityEncoder.
Os construtores definem códigos de status, os cabeçalhos tipados permanecem seguros, e cookies e redirecionamentos são apenas transformações de respostas.
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 “Solicitações e respostas” é grátis?
Sim — o texto completo de “Solicitações e respostas” é 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 “Solicitações e respostas”?
Leia a entrada e retorne a saída. 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 2 de 4.
Quanto tempo leva a aula “Solicitações e respostas”?
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