Edited at
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があります。


最後に

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