Richieste e risposte
Legga l'input e restituisca l'output.
Richieste e risposte è una lezione Scala for Backend Engineering & Functional Programming gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Scala for Backend Engineering & Functional Programming, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Scala for Backend Engineering & Functional Programming include 4 lezioni in totale.
La richiesta come valore
In http4s una Request[F] è un valore immutabile che contiene metodo, URI, intestazioni, versione HTTP e un body in streaming. La esamina con accessor puri e non la modifica mai direttamente.
Per modificare una richiesta, produca una copia tramite withHeaders, withUri o combinatori simili.
val r: Request[IO] = Request[IO](
method = Method.GET,
uri = uri"/health"
)Il body in streaming
Il body di una richiesta o risposta è uno fs2.Stream[F, Byte]. Viene consumato in modo lazy e tramite effetti, quindi i payload di grandi dimensioni non devono mai risiedere interamente in memoria.
Di solito non deve gestire i byte grezzi: se ne occupa un EntityDecoder.
// raw access (rarely needed)
val bytes: fs2.Stream[IO, Byte] = request.bodyDecodifica del body
Un EntityDecoder[F, A] sa trasformare lo stream del body in un valore A. Chiami req.as[A] per decodificare; il risultato è F[A] e l'effetto fallisce se il body non è valido.
È disponibile un decoder integrato per String; quelli più ricchi provengono dai moduli JSON.
HttpRoutes.of[IO] {
case req @ POST -> Root / "echo" =>
req.as[String].flatMap(body => Ok(body))
}Associazione della richiesta
Per accedere all'oggetto richiesta all'interno di un caso, lo associ con @. Qui req identifica l'intera richiesta, mentre il pattern continua a confrontare metodo e percorso.
Senza il binder dispone solo delle parti destrutturate e non può leggere il body o le intestazioni.
HttpRoutes.of[IO] {
case req @ PUT -> Root / "name" =>
req.as[String].flatMap(n => Ok(s"set $n"))
}Lettura delle intestazioni
Le intestazioni si trovano in request.headers. Usi headers.get[H] con un modello di intestazione tipizzato, oppure headers.get(CIString("X-Custom")) per nomi arbitrari.
Le intestazioni tipizzate, come Authorization e Content-Type, analizzano e convalidano automaticamente i propri valori.
import org.http4s.headers.Authorization
val auth: Option[Authorization] =
request.headers.get[Authorization]Costruzione delle risposte
I builder di risposta della DSL, come Ok, Created e NotFound, sono funzioni che restituiscono F[Response[F]]. Passando un argomento, imposta il body tramite un EntityEncoder.
Ogni builder corrisponde a un codice di stato, quindi Created(...) produce 201.
Ok("all good") // 200
Created("made it") // 201
NotFound("missing") // 404Codici di stato direttamente
Per uno stato senza builder dedicato, o per personalizzarlo, costruisca un Response[F] con uno Status esplicito e concateni withEntity.
In questo modo ottiene il pieno controllo su stato, intestazioni e body in un'unica espressione.
import org.http4s.{Response, Status}
Response[IO](Status.Accepted)
.withEntity("queued")
.pure[IO]Codifica dei body
Un EntityEncoder[F, A] serializza un valore nel body della risposta e imposta il Content-Type. Gli encoder per String e per i byte sono integrati; gli encoder JSON provengono da circe.
Quando passa un valore a Ok(value), http4s cerca implicitamente l'encoder.
// String encoder is implicit; sets text/plain
val resp: IO[Response[IO]] = Ok("plain text body")Impostazione delle intestazioni di risposta
Aggiunga le intestazioni passandole come argomenti aggiuntivi a un builder, oppure concateni .map(_.putHeaders(...)) all'effetto della risposta.
I modelli di intestazione tipizzati garantiscono valori formattati correttamente, ad esempio un'intestazione Location per una risposta 201 Created.
import org.http4s.headers.Location
Created("ok").map(_.putHeaders(
Location(uri"/items/42")
))Gestione degli errori di decodifica
req.as[A] fa fallire l'effetto F quando il body non può essere decodificato. Usi req.attemptAs[A].value per ottenere un F[Either[DecodeFailure, A]] e risponda con 400 nel ramo sinistro.
In questo modo la gestione degli input non validi rimane esplicita e totale.
req.attemptAs[String].value.flatMap {
case Right(b) => Ok(b)
case Left(_) => BadRequest("bad body")
}Cookie e redirect
Imposti i cookie con response.addCookie(ResponseCookie(name, value)). Per i redirect, usi un builder 3xx e un'intestazione Location.
SeeOther(Location(uri)) esegue un 303, la risposta idiomatica per il post-redirect-get.
import org.http4s.headers.Location
SeeOther(Location(uri"/login"))
.map(_.addCookie("sid", "abc123"))Verifica rapida
Rifletta sulla decodifica sicura del body.
Riepilogo
Le richieste e le risposte sono valori immutabili con body fs2 in streaming. Si esegue il decoding con as/attemptAs tramite EntityDecoder e l’encoding con EntityEncoder.
I builder impostano i codici di stato, gli header tipizzati mantengono la sicurezza dei tipi e cookie e redirect sono semplicemente trasformazioni della risposta.
Impara Scala con un tutor IA — gratis
Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.
- Corsi
- 39
- Lezioni
- 143
Domande Frequenti
La lezione «Richieste e risposte» è gratuita?
Sì — il testo completo di «Richieste e risposte» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Scala for Backend Engineering & Functional Programming, passa a CoddyKit PRO. Il corso Scala for Backend Engineering & Functional Programming include 4 lezioni in totale.
Cosa imparerò in «Richieste e risposte»?
Legga l'input e restituisca l'output. Eserciti Scala for Backend Engineering & Functional Programming con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Scala for Backend Engineering & Functional Programming?
Non è richiesta alcuna esperienza precedente. Scala for Backend Engineering & Functional Programming su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.
Quanto tempo richiede la lezione «Richieste e risposte»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Scala for Backend Engineering & Functional Programming?
Sì. Ogni lezione Scala for Backend Engineering & Functional Programming include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Route e HttpRoutes
- Richieste e risposte
- Endpoint JSON
- Servire l'applicazione