2016-10-01 1 views
0

Ich bin auf der Suche nach einer Möglichkeit, eine Funktion zu konvertieren, die grundlegende Parametertypen verwendet und sie zur Verarbeitung eines akka HttpRequest verwendet. Ich möchte die Path automatisch verarbeitet und an die Funktion übergeben."Lifting" Eine Scala-Funktion in einen HttpRequest-Prozessor

Als Beispiel gegeben einig Funktion

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

es nützlich wäre, die Funktion, eine Art von „Heben“, um ein Path zu verarbeiten. Ein Beispiel-URL-Pfad könnte

sein

/foobar/einstein/42/2016

Die Hebefunktion etwas aussehen würde:

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) 
} 

, die dann in der folgenden Art und Weise verwendet werden könnten, :

Diese Hubfunktion müsste durch th durchlaufen e Funktionsparametertypen und wandeln den entsprechenden Pfadabschnitt in den passenden Typ um, bevor die Werte an die Funktion übergeben werden. Die Beispiel-URL würde mit dem Ergebnis des Aufrufs foobar("enstein", 42, 2016) vervollständigt werden.

Gibt es trotzdem in den Bibliotheken dies zu tun? Wenn nicht, gibt es eine Möglichkeit, Lifter zu definieren?

Vielen Dank im Voraus für Ihre Berücksichtigung und Antwort.

+0

Ich denke, die idiomatische Art, es zu tun, würde die 3 verschiedenen Pfad-Anweisungen hinzufügen, um mit einem String, Int und Long übereinstimmen und rufen Sie dann die Funktion mit ihm. Sie können immer eine benutzerdefinierte Direktive erstellen, die diese 3 Typen extrahiert und dann eine Funktion mit diesen Werten aufruft –

Antwort

1

Sie scheinen eine Route anstelle einer Directive erstellen zu wollen. Der Unterschied ist, dass eine Route tatsächlich eine Anfrage bearbeitet, während eine Directive eine Route mit mehr Funktionalität umschließt. Sie scheinen endlich eine Anfrage bearbeiten zu wollen, also sollte es eine Route sein.

Sie scheinen nach einer sehr allgemeinen Lösung zu suchen, die für jede Funktion funktionieren würde. Dies ist derzeit nur sehr schwer (oder sogar unmöglich) zu tun, nicht zuletzt, weil Sie irgendwie angeben müssen, wie Parameter analysiert werden sollen. spray-routing/akka-http-Routen entmutigen tatsächlich einen solchen Stil zugunsten einer expliziteren Vorgehensweise.

z. angesichts Ihrer gegebenen Funktionsdefinition von (String, Int, Long) => Route würde die Route wie folgt aussehen:

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

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

Wenn Sie foobar nicht konvertieren kann eine Route zurückkehren können Sie auch einen Helfer erstellen, die die Funktion wie folgt konvertiert:

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)) 

Sie müssen diese Funktion für alle Aritäten neu erstellen (oder etwas flexibler mit formlosen, das ist eine erweiterte Übung;)).

Verwandte Themen