Scala
Akka-HTTP
ScalaDay 21

Akka-httpで出来ること

すでに多くのAkka httpの記事が出ているのでポイントを絞ってみました。
Akka httpを選択する理由として参考にして貰えると有り難いです。

Akka httpにおけるask

path("hello") {
        get {
          onComplete(
            (supervisorActor ? "ping").mapTo[String]) {
              case Success(text: String) =>
                complete(HttpEntity(ContentTypes.`text/html(UTF-8)`, s"<h1>Say hello to akka-http: $text</h1>"))
              case Failure(ex) =>
                complete(StatusCodes.InternalServerError)
            }
        }
      }

askを使ってメッセージを送る場合は、onCompleteを使います。

implicit val timeout = Timeout(5 seconds)

Timeoutをimplicitすることで、メッセージが帰ってこなかった場合は Failure が帰ります。

~

...
} ~
pathPrefix("hoge") { ...

チルダ(~)を使うと、最初のルーティングがリクエストを拒否した場合に次のルーティングを検証してくれます。
例外が発生しやすいaskを実行しても、うまくリカバリーできそうな所が良いですね!

entity

entity(as[Apple]) { apple =>
   ...
}

jsonFormat1〜22までのjson文字列をパースしEntityに変換出来ます。

implicit val appleFormat = jsonFormat14(Apple)

キーが14個あれば、jsonFormat14を使います。
typeというキーが使いたい場合は、 `type` にします。

先程のチルダ(~)と組み合わせれば、型が一致するまでルーティングを検証してくれるので、型にあわせたルーティングも可能になりますね。

entityが使えない場面でも・・・?

onComplete(Unmarshal(json).to[Apple]) { ... }

Unmarshalを使うことで、entityが使えない場面でもjsonをパースできます。
この場合は、onCompleteを使います。

id

pathPrefix("item" / LongNumber) { id => ... }

URLからidを取得する方法です。わかりやすいです。
他にも正規表現を使ったりパターンマッチなど様々なMatcherがあります。

最後に

直感的でシンプルでわかりやすく、実際の処理は !? に処理を投げ、例外時のリカバリもしやすいのでおすすめです。