5 votes

Quelle est la bonne façon d'envoyer une réponse JSON dans http4s ?

Il n'y a pas si longtemps, je suis passé de akka-http à http4s. L'une des choses fondamentales que je voulais faire correctement est la gestion de JSON, en particulier l'envoi d'une réponse JSON.

J'ai décidé d'utiliser http4s avec ZIO au lieu de cats, voici donc à quoi ressemble une route http :

import fs2.Stream
import org.http4s._
import org.http4s.dsl.io._
import org.http4s.implicits._
import scalaz.zio.Task
import scalaz.zio.interop.catz._
import io.circe.generic.auto._
import io.circe.syntax._

class TweetsRoutes {

  case class Tweet(author: String, tweet: String)

  val helloWorldService = HttpRoutes.of[Task] {
    case GET -> Root / "hello" / name => Task {
      Response[Task](Ok)
        .withBodyStream(Stream.emits(
          Tweet(name, "dummy tweet text").asJson.toString.getBytes
        ))
    }
  }.orNotFound

}

Comme vous le voyez, la partie sérialisation JSON est assez verbeuse :

.withBodyStream(Stream.emits(
  Tweet(name, "dummy tweet text").asJson.toString.getBytes
))

Existe-t-il un autre moyen d'envoyer du JSON dans une réponse ?

7voto

toxicafunk Points 89

Oui, il existe : définissez un encodeur et un décodeur pour la tâche :

implicit def circeJsonDecoder[A](
      implicit decoder: Decoder[A]
  ): EntityDecoder[Task, A] = jsonOf[Task, A]
  implicit def circeJsonEncoder[A](
      implicit encoder: Encoder[A]
  ): EntityEncoder[Task, A] = jsonEncoderOf[Task, A]

Ainsi, il n'est pas nécessaire de transformer les données en octets.

EDIT : un exemple complet est disponible ici : https://github.com/mschuwalow/zio-todo-backend/blob/develop/src/main/scala/com/schuwalow/zio/todo/http/TodoService.scala

HT : @mschuwalow

1voto

Alex Fruzenshtein Points 594

Il existe une solution encore plus simple. Si vous souhaitez gérer l'encodage JSON de la classe de cas pour les réponses HTTP, il vous suffit d'ajouter ces importations :

import io.circe.generic.auto._
import org.http4s.circe.CirceEntityCodec._

BTW, les mêmes importations gèrent également le décodage des requêtes JSON entrantes dans les classes de cas

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X