2016-10-01 10 views
0

基本パラメータ型を取り、akka HttpRequestを処理する関数を変換する方法を探しています。 Pathが自動的に処理されて関数に渡されるようにします。例としてスカラ関数をHttpRequestプロセッサに持ち上げる

Pathを処理する機能を「持ち上げる」の方法を有することが有用であろういくつかの機能

def foobar(str : String, i : Int, l : Long) : String = ??? 

を与え。

次のように使用することができ
import akka.http.scaladsl.model.Uri.Path 
import akka.http.scaladsl.server.Directive 

type SomeFunctionType = ??? 

def lifter(function : SomeFunctionType, path : Path) : Directive = { 

    val funcResult = ??? //somehow call function on the Path elements 

    complete(funcResult) 
} 

:たとえばURLパスできたこと

/foobarに/アインシュタイン/ 2016分の42

昇降機能は、次のようになります:

val route = 
    get { 
    pathPrefix("foobar") { 
     extractUnmatchedPath { remainingPath => 
     lifter(foobar, remainingPath) 
     } 
    } 
    } 

このリフティング機能は、関数に渡す前に、対応するPathセクションを一致する型に変換します。 URL例は、foobar("enstein", 42, 2016)という呼び出しの結果で完了します。

ライブラリでこれを行うにはどうしますか?そうでない場合、リフターを定義する方法はありますか?

お気軽にご相談ください。

+0

私はそれを行う慣習的なやり方は、3つの異なるパスディレクティブを追加してString、Int、Longと照合し、その関数を呼び出していると思います。これら3つの型を抽出し、これらの値を持つ関数を呼び出すカスタムディレクティブをいつでも作成できます –

答えて

1

Directiveではなく、Routeを作成すると思われます。違いは、Directiveがより多くの機能を持つルートをラップしている間にRouteが実際に要求を処理する点です。最終的にリクエストを処理したいと思われるので、Routeにする必要があります。

すべての機能で機能する非常に汎用的なソリューションを探しているようです。これは、パラメータの解析方法を何らかの形で指定する必要があるため、これは現在のところ非常に難しい(または不可能ですら)。スプレールーティング/ akka-httpルートは実際には、より明示的なやり方を好むように、このようなスタイルをやや抑えます。

など。あなたはまた、このように機能を変換するヘルパーを作成することができ、ルートを返すようにfoobarに変換することができない場合

def foobar(str: String, i: Int, l: Long): Route = complete(s"$str : $i : $l") // example implementation 

// usage 
path("foobar"/Segment/IntNumber/LongNumber)(foobar) 

def foobar(str: String, i: Int, l: Long): String = s"$str : $i : $l" 

def fromStringFunc3[T1, T2, T3](f: (T1, T2, T3) ⇒ String): (T1, T2, T3) ⇒ Route = 
(t1, t2, t3) ⇒ complete(f(t1, t2, t3)) 

// usage 
path("foobar"/Segment/IntNumber/LongNumber)(fromStringFunc3(foobar)) 
(String, Int, Long) => Routeのご与えられた関数の定義を考えると、ルートは次のようになります。

しかし、あなたはすべてのアリーティに対してこの機能を再現しなければなりません(または、高度なエクササイズであるシェイプレスでより柔軟なものを構築してください))。

関連する問題