🥰

http4s の最小構成

2022/10/14に公開約2,100字

scala-cli の場合

Server.scala
// 非同期ランタイム
//> using lib "org.typelevel::cats-effect:3.3.14"
// http 関係
// http の基本型など
//> using lib "org.http4s::http4s-core:1.0.0-M37"
// ルーティング DSL など
//> using lib "org.http4s::http4s-dsl:1.0.0-M37"
// http サーバー
//> using lib "org.http4s::http4s-ember-server:1.0.0-M37"

import cats.effect._

import org.http4s.HttpRoutes
// Request => F[Response] を表現する型
import com.comcast.ip4s._ 
// ipv4"0.0.0.0", port"8080" などを書けるようにする(不正な値はコンパイルエラー.)
import org.http4s.dsl.io._ 
// case GET -> Root / "echo" / arg => などを書けるようにする
import org.http4s.implicits._
import org.http4s.ember.server._

object Main extends IOApp {

    val echo = HttpRoutes.of[IO] {
        case GET -> Root / "echo" / arg => Ok(arg)
    }.orNotFound
    def run(args: List[String]):IO[ExitCode] = EmberServerBuilder
      .default[IO] // EmberServerBuilder[cats.effect.IO]
      .withHost(ipv4"0.0.0.0")
      .withPort(port"8080")
      .withHttpApp(echo)
      .build // Resource[IO,Server]
      .useForever // IO[Nothing]
      .as(ExitCode.Success) // IO[ExitCode]
}
scala-cli Server.scala

SBT プロジェクトの場合

build.sbt
val V = new {
  val http4s = "1.0.0-M37"
}

lazy val server = project.in(file("."))
  .settings(
    scalaVersion := "3.2.0",
    libraryDependencies ++= Seq(
      "org.typelevel" %% "cats-effect" % "3.3.14"
    ) ++ Seq("core","dsl","ember-server").map( mod =>
      "org.http4s" %% s"http4s-$mod" % V.http4s
    )
  )
src/main/scala/Server.scala
import cats.effect._

import org.http4s.HttpRoutes
import com.comcast.ip4s._
import org.http4s.dsl.io._
import org.http4s.implicits._
import org.http4s.ember.server._


object Main extends IOApp {

    val echo = HttpRoutes.of[IO] {
        case GET -> Root / "echo" / arg => Ok(arg)
    }.orNotFound
    def run(args: List[String]):IO[ExitCode] = EmberServerBuilder
      .default[IO] // EmberServerBuilder[cats.effect.IO]
      .withHost(ipv4"0.0.0.0")
      .withPort(port"8080")
      .withHttpApp(echo)
      .build // Resource[IO,Server]
      .useForever // IO[Nothing]
      .as(ExitCode.Success) // IO[ExitCode]
}
sbt run

Discussion

ログインするとコメントできます