読者です 読者をやめる 読者になる 読者になる

mike-neckのブログ

JavaかJavaFXかJavaEE(なんかJava8が多め)

Finagle/finchを試してみた - その1

scala

表記の通り、twitterが作ってるFinagleというwebフレームワークのfinchというのを試してみました(とはいっても、まだgetting started)。

このライブラリーを知ったのは吉田さんのブログエントリー

d.hatena.ne.jp

Playフレームワークをいろいろといじっている最中だったのだけど、Slickのあれで意識が薄れてしまったので(あまり集中力がない)、Playに戻るのもあれだなぁと思っていた所で、ドキュメントがしっかりしていそうだから、finchをやってみることにしました。

とりあえず、本当のgetting started状態なので、ドキュメント

github.com

に書いてある内容をAppクラスを継承したオブジェクトに書いていっただけ。

package com.example

import com.twitter.finagle.Httpx
import com.twitter.util.Await
import io.finch.request._
import io.finch.route._

object WebApp extends App {
  // getパラメーター title を取得する
  val title: RequestReader[String] = paramOption("title").withDefault("")
  // ルーティングの設定 GET http://localhost:8081/hi/name
  // あるいは GET http://localhost:8081/hello/name
  // に来たリクエストをさばく
  val api: Router[String] =
    get(("hello" | "hi") / string ? title) {(name: String, title: String) =>
      s"Hello, $title ${name}!"
    }
  // サーバーを起動
  Await.ready(Httpx.serve(":8081", api.toService))
}

これだけで、ひとつのapiが完成です。

$curl -X GET http://localhost:8081/hi/Finch?title=Finagle
Hello, Finagle Finch!
$ curl -X GET http://localhost:8081/hello/Valmer
Hello,  Valmer!
$ curl -v -X GET http://localhost:8081/hi
*   Trying ::1...
* Connected to localhost (::1) port 8081 (#0)
> GET /hi HTTP/1.1
> Host: localhost:8081
> User-Agent: curl/7.43.0
> Accept: */*
> 
< HTTP/1.1 404 Not Found
< Content-Length: 0
< 
* Connection #0 to host localhost left intact

ドキュメントが間違っている部分

一箇所だけ、ドキュメントが間違っていました。

The following code serves the given API endpoint with Finagle's Http codec. Await.ready(Http.serve(":8081", api.toService))

これをそのまま写すと、コンパイルエラーになっていました。

正しくは com.twitter.finagle.Httpxを用います。


つづく(のか?)