Vamos hacer un pequeño proyecto con ZIO, como para empezar. El "hola mundo" de toda la vida pero en un servicio REST.
Antes de empezar vamos a hacer un proyecto con scala 3 con sbt :
sbt new scala/scala3.g8
Luego agregamos las dependencias de zio, el build.sbt debe quedar así :
scalaVersion := "3.1.2"
organization := "dev.zio"
name := "zio-quickstart-restful-webservice"
libraryDependencies ++= Seq(
"dev.zio" %% "zio" % "2.0.0",
"dev.zio" %% "zio-json" % "0.3.0-RC10",
"io.d11" %% "zhttp" % "2.0.0-RC10",
"io.getquill" %% "quill-zio" % "4.2.0",
"io.getquill" %% "quill-jdbc-zio" % "4.2.0",
"com.h2database" % "h2" % "2.1.214"
)
Aclaro que tengo otras dependencias como la de base de dato que las voy a usar en proximos ejemplos.
Y ahore si, hacemos el web service para nuestro "hola mundo" :
package dev.zio.quickstart.greet
import zhttp.http._
object GreetingApp {
def apply(): Http[Any, Nothing, Request, Response] =
Http.collect[Request] {
// GET /greet?name=:name
case req@(Method.GET -> !! / "greet") if (req.url.queryParams.nonEmpty) =>
Response.text(s"Hello ${req.url.queryParams("name").mkString(" and ")}!")
// GET /greet
case Method.GET -> !! / "greet" =>
Response.text(s"Hello World!")
// GET /greet/:name
case Method.GET -> !! / "greet" / name =>
Response.text(s"Hello $name!")
}
}
Luego programamos el Main :
package dev.zio.quickstart
import dev.zio.quickstart.counter.CounterApp
import dev.zio.quickstart.download.DownloadApp
import dev.zio.quickstart.greet.GreetingApp
import dev.zio.quickstart.users.{InmemoryUserRepo, PersistentUserRepo, UserApp}
import zhttp.service.Server
import zio._
object MainApp extends ZIOAppDefault {
def run =
Server.start(
port = 8999,
http = GreetingApp()
).provide(
// An layer responsible for storing the state of the `counterApp`
ZLayer.fromZIO(Ref.make(0)),
// To use the persistence layer, provide the `PersistentUserRepo.layer` layer instead
InmemoryUserRepo.layer
)
}
Y listo!! Si vamos a http://localhost:8999/greet?name=Emanuel me va a saludar.
Para correrlo lo pueden hacer con sbt run o con intellij corriendo el Main.
Dejo el repo :
https://github.com/emanuelpeg/zio-quickstart-restful-webservice