finatraでCustom requestを作るときはRequestProxyを使う

January 28, 2018

基本的にはこのドキュメントにあるように、適当なcase classを作ると自動でマッピングしてくれる。

HTTP Requests — Finatra 18.1.0 documentation

case class HiRequest(id: Long, name: String)

...

post("/hi") { hiRequest: HiRequest =>
  "Hello " + hiRequest.name + " with id " + hiRequest.id
}

ただしこれだと元のcom.twitter.finagle.http.Requestを実装していないことになってしまって、もともとあったヘッダーやHTTPメソッドなどの情報が取れなくなってしまう。 Requestを実装しようにも必要なフィールドが多くて難しそう。

case class HogeRequest extends Request {
  override def ctx: Schema.Record = ???

  override def multipart: Option[Multipart] = ???

  override def method: Method = ???

  override def method_=(method: Method): Unit = ???

  override def uri: String = ???

  override def uri_=(uri: String): Unit = ???

  override def remoteSocketAddress: InetSocketAddress = ???

  override def reader: Reader = ???

  override def writer: Writer with Closable = ???

  override def headerMap: HeaderMap = ???
}

com.twitter.finagle.http.RequestProxyを使う

よくよくコメントを見ると、RequestProxyを使えと書いてあった。

/**
 * Rich HttpRequest.
 *
 * Use RequestProxy to create an even richer subclass.
 */
abstract class Request private extends Message {

これを使うとrequestだけを実装すればOK。

/**
 * Underlying `Request`
 */
def request: Request
case class MyRequest(hoge: String, request: Request) extends RequestProxy
このエントリーをはてなブックマークに追加