仕事でちょっとしたツール(Webアプリ)を作るのに試しにAkka HTTPを使ってみています。Akka HTTPでJSONを使う方法については以前このブログでも紹介しましたが、
今回はいわゆるHTMLを返すシンプルな作りの管理ツールなのでJavaScriptやCSSライブラリはWebJarsで、HTMLのレンダリングはTwirlを使うようにしてみました。
WebJars
ThoughtWorksのリポジトリにAkka HTTPでWebJarsを使うためのライブラリがありました。
メンテが止まっているようですが、リポジトリ内のWebJarsSupportは現在のAkka HTTPでもそのまま利用できます。実装としては非常にシンプルで、webjars-locatorで取得したクラスパス内のリソースをgetFromResource()
で返しているだけです。
これを使う場合はbuild.sbt
に以下の依存関係を追加する必要があります。
"org.webjars" % "webjars-locator" % "0.32"
WebJarsのリソースを返すエンドポイントはこんな感じ。/webjars/jquery.js
のようなパスでWebJarsでインポートしたJavaScriptやCSSを参照できます。
import com.thoughtworks.akka.http.WebJarsSupport._ get { pathPrefix("webjars") { webJars } }
Twirl
Twirlもライブラリを作っている人がいました。
こちらも最新の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アプリを作ることができるんじゃないかと思います。フォームのバリデーションなどもあると便利ですが、そのあたりも拡張して便利に使えるものを組み込んでしまうのがよさそうです。