从Akka Http迁移到Http 4s-自定义指令

qacovj5a  于 2022-11-05  发布在  其他
关注(0)|答案(1)|浏览(151)

我开始学习Http4,在工作中我们可能需要将用Akka Http实现的Rest API迁移到Http4。
例如,我可以定义如下自定义指令:

trait CustomDirectives {

  def extractUUID: Directive1[UUID] = {
    path(Segment).flatMap { maybeuuid =>
      Try(UUID.fromString(maybeuuid)) match {
        case Success(result) => provide(result)
        case Failure(_) =>
          complete(StatusCodes.BadRequest, s"Invalid uuid: $maybeuuid")
      }
    }
  }

}

所以每次我想提取一个UUID并验证它的时候,我都可以使用这个指令。我们还有其他的自定义指令来对头文件进行一些处理,等等。
在Http4中有没有类似于akka自定义指令的东西?

7ivaypg9

7ivaypg91#

这在文档的处理路径参数部分中进行了描述

// standard Scala extractor, matching String against UUID
object UUIDVar {
  def unapply(maybeuuid: String): Option[UUID] =
    Try(UUID.fromString(maybeuuid)).toOption
}

val usersService = HttpRoutes.of[IO] {
  // just use extractor in pattern matching
  case GET -> Root / "users" / UUIDVar(uuid) =>
    Ok(useUUIDForSth(uuid))
}

然而,就我个人而言,我发现使用TapirEndpoint4s等库来描述端点更容易,因为它们的DSL对我来说更直观,而且我没有将我的代码与特定的实现相耦合。

相关问题