3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ScalaAdvent Calendar 2018

Day 21

Akka-httpで出来ること

Last updated at Posted at 2018-12-20

すでに多くの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があります。

最後に

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

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?