JSON-endpoints
Kombinér http4s med Circe.
JSON-endpoints er en gratis Scala til backendudvikling og funktionel programmering-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Scala til backendudvikling og funktionel programmering, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Scala til backendudvikling og funktionel programmering-kurset indeholder 4 lektioner i alt.
JSON via circe
http4s integrerer JSON via modulet http4s-circe, som forbinder circe-codecs med EntityDecoder og EntityEncoder. circe er det de facto-funktionelle JSON-bibliotek til Scala.
Du definerer instanser af Encoder og Decoder for dine typer og lader http4s håndtere formatet på ledningen.
// build.sbt
// "org.http4s" %% "http4s-circe" % http4sV
// "io.circe" %% "circe-generic" % circeVAutomatisk generering af codecs
Med circe-generic kan du automatisk generere codecs ved hjælp af deriveEncoder/deriveDecoder eller annoteringen @JsonCodec. De knytter felter i case-klasser til JSON-nøgler efter navn.
Genereringen kræver codecs for hver felttype, rekursivt.
import io.circe.generic.semiauto._
case class User(id: Int, name: String)
implicit val enc = deriveEncoder[User]
implicit val dec = deriveDecoder[User]EntityEncoder fra circe
Importen org.http4s.circe.CirceEntityEncoder._ leverer en implicit EntityEncoder[F, A] for enhver A med en circe-Encoder. Derefter serialiserer Ok(user) til JSON med application/json.
Der er ikke behov for manuel konvertering til Json i håndteringsfunktioner.
import org.http4s.circe.CirceEntityEncoder._
HttpRoutes.of[IO] {
case GET -> Root / "me" => Ok(User(1, "Ada"))
}EntityDecoder fra circe
Det fungerer tilsvarende den anden vej: org.http4s.circe.CirceEntityDecoder._ leverer en EntityDecoder[F, A] for enhver A med en circe-Decoder. Derefter fortolker req.as[User] JSON-legemet.
Begge importer er samlet i CirceEntityCodec._.
import org.http4s.circe.CirceEntityDecoder._
case req @ POST -> Root / "users" =>
req.as[User].flatMap(u => Created(u))En komplet JSON-POST
Ved at kombinere afkodning og kodning får du et rent oprettelses-endpoint: fortolk den indkommende JSON til en domænetype, kør forretningslogikken, og kod derefter resultatet tilbage som JSON.
Fejl ved afkodning vises som 422 eller 400 via circe-decoderen.
import org.http4s.circe.CirceEntityCodec._
case req @ POST -> Root / "users" =>
for {
in <- req.as[User]
out <- store.create(in)
res <- Created(out)
} yield resjson-interpolatoren
Til ad hoc-JSON opretter circes json-strenginterpolator fra io.circe.literal en Json-værdi direkte med interpolerede Scala-værdier.
Det er nyttigt til små svar eller test-fixtures uden en case-klasse.
import io.circe.literal._
val body = json"""{ "status": "ok", "count": 3 }"""
Ok(body)Brugerdefinerede feltnavne
Når JSON-nøglerne adskiller sig fra Scala-feltnavnene, kan du udlede dem med en Configuration fra circe-generic-extras, f.eks. snake_case, eller skrive codecen manuelt ved hjælp af forProduct2.
På den måde kobler du din API-kontrakt fra den interne navngivning.
import io.circe.Encoder
implicit val e: Encoder[User] =
Encoder.forProduct2("user_id", "full_name")(u => (u.id, u.name))Kodning af lister
circe leverer automatisk codecs til List, Vector, Option og Map, så snart der findes et codec til elementerne. Derfor fungerer det direkte at returnere en samling.
En tom liste kodes som [], og None som enten en manglende nøgle eller null.
import org.http4s.circe.CirceEntityEncoder._
case GET -> Root / "users" =>
store.all.flatMap(us => Ok(us)) // List[User] -> JSON arrayValidering af afkodet JSON
Afkodning giver dig en syntaktisk gyldig værdi; den semantiske validering er dit ansvar. Kør kontroller efter as, og afbryd med BadRequest, når værdien er ugyldig.
Bevar domæneinvarianter i smarte konstruktører, der returnerer Either, så koden forbliver tydelig.
req.as[User].flatMap { u =>
if (u.name.nonEmpty) Created(u)
else BadRequest("name required")
}Fejlsvar som JSON
Returner strukturerede fejl som JSON, så klienter kan fortolke dem. Definer en fejl-case-klasse med en circe-encoder, og giv den til den relevante status-builder.
Ensartede fejlstrukturer gør API'er langt lettere at bruge.
case class ApiError(code: String, message: String)
implicit val e = deriveEncoder[ApiError]
BadRequest(ApiError("E_NAME", "name required"))Streamende JSON
For store samlinger kan du streame JSON i stedet for at gemme det hele i hukommelsen. jsonEncoderOf sammen med en fs2-Stream[F, A] udsender et JSON-array trinvist.
Det holder hukommelsesforbruget konstant for store resultatsæt ved at udnytte fs2's back-pressure.
import org.http4s.circe.streamJsonArrayEncoder
case GET -> Root / "feed" =>
Ok(store.streamAll) // fs2.Stream[IO, Event]Hurtigt tjek
Genkald hvilken import der aktiverer afkodning af et JSON-legeme til en case-klasse.
Opsummering
Du forbandt JSON med http4s-circe: generer codecs, importér CirceEntityCodec, og brug Ok(value) / req.as[A] til komplet JSON-input og -output.
Du håndterede lister, brugerdefinerede feltnavne, strukturerede JSON-fejl og endda streamende arrays til store datamængder.
Lær Scala med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 39
- Lektioner
- 143
Ofte stillede spørgsmål
Er lektionen “JSON-endpoints” gratis?
Ja — hele teksten til “JSON-endpoints” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Scala til backendudvikling og funktionel programmering-kurset, skal du opgradere til CoddyKit PRO. Scala til backendudvikling og funktionel programmering-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “JSON-endpoints”?
Kombinér http4s med Circe. Du øver dig i Scala til backendudvikling og funktionel programmering med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Scala til backendudvikling og funktionel programmering?
Der kræves ingen tidligere erfaring. Scala til backendudvikling og funktionel programmering på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.
Hvor lang tid tager lektionen “JSON-endpoints”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Scala til backendudvikling og funktionel programmering-lektion?
Ja. Alle Scala til backendudvikling og funktionel programmering-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.