すでに多くの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があります。
最後に
直感的でシンプルでわかりやすく、実際の処理は !
や ?
に処理を投げ、例外時のリカバリもしやすいのでおすすめです。