Akka HTTPでWebJarsとTwirlを使う

仕事でちょっとしたツール(Webアプリ)を作るのに試しにAkka HTTPを使ってみています。Akka HTTPでJSONを使う方法については以前このブログでも紹介しましたが、

takezoe.hatenablog.com

今回はいわゆるHTMLを返すシンプルな作りの管理ツールなのでJavaScriptCSSライブラリはWebJarsで、HTMLのレンダリングはTwirlを使うようにしてみました。

WebJars

ThoughtWorksリポジトリにAkka HTTPでWebJarsを使うためのライブラリがありました。

github.com

メンテが止まっているようですが、リポジトリ内のWebJarsSupportは現在のAkka HTTPでもそのまま利用できます。実装としては非常にシンプルで、webjars-locatorで取得したクラスパス内のリソースをgetFromResource()で返しているだけです。

これを使う場合はbuild.sbtに以下の依存関係を追加する必要があります。

"org.webjars" % "webjars-locator" % "0.32"

WebJarsのリソースを返すエンドポイントはこんな感じ。/webjars/jquery.jsのようなパスでWebJarsでインポートしたJavaScriptCSSを参照できます。

import com.thoughtworks.akka.http.WebJarsSupport._

get {
  pathPrefix("webjars") {
    webJars
  }
}

Twirl

Twirlもライブラリを作っている人がいました。

github.com

こちらも最新のAkka HTTPのバージョンには追従できていないようですが、TwirlのHtml型などに対応するマーシャラーを定義しているだけのシンプルなものなので、リポジトリ内のTwirlSupportをそのまま持ってきて使ってもよいでしょう。

これを使う場合は普通にTwirlを使う場合と同様の設定が必要になります。まずはproject/plugins.sbtにTwirlプラグインを追加。

addSbtPlugin("com.typesafe.sbt" % "sbt-twirl" % "1.3.4")

build.sbtでTwirlプラグインを有効化します。

enablePlugins(SbtTwirl)

Twirlのテンプレートファイルはsrc/main/twirlディレクトリ配下に作成し、エンドポイントからは以下のようにして呼び出します。

import akkahttptwirl.TwirlSupport._

get {
  path("hello") {
    // src/main/twirl/hello.scala.html
    complete(html.hello())
  } ~
}

おまけ:静的ファイルを返す

おまけとしてAkka HTTPで静的ファイルを返す方法を書いておきます。ファイルシステム上のファイルを返す場合はこんな感じ。

get {
  pathPrefix("assets") {
    getFromDirectory("assets")
  }
}

クラスパス内のリソースを返すこともできます。

get {
  pathPrefix("assets") {
    getFromResourceDirectory("assets")
  }
}

とりあえずこのくらいでAkka HTTPで普通のWebアプリを作ることができるんじゃないかと思います。フォームのバリデーションなどもあると便利ですが、そのあたりも拡張して便利に使えるものを組み込んでしまうのがよさそうです。