2016-07-10 33 views
0

Ich versuche, mein Front-End von Akka-HTTP (2.4.7) zugänglich zu machen. Obwohl alles gut mit regulären Routen funktioniert, kann ich nicht herausfinden, wie HTML5 PushState-Unterstützung aktiviert wird. Mein bester Versuch war, die RejectionHandler- und handleRejection-Direktive zu verwenden.Akka-HTTP-Wiederherstellung von der Zurückweisung (für HTML5-Verlauf api-Routing)

Wer hat irgendwelche Vorschläge, um es richtig zu machen?

def router = pathPrefix("") { 
    get { 
     pathEndOrSingleSlash { 
      getFromDirectory("app/index.html") 
     } ~ handleRejections(RejectionHandler.newBuilder().handleNotFound { 
      println("REJECTION!!!!!!!!") 
      // should be something else? 
      getFromDirectory("app/index.html") 
     }.result()) { 
      getFromDirectory("app") 
     } 
    } 
} 

ich von der Wurzel statische Inhalte jedoch diene path("/"), möchte ich erholen, wenn eine Ressource nicht gefunden wird. Zum Beispiel verwendet meine Anwendung den HTML5-Druckstatus, um den anzuzeigenden Inhalt zu bestimmen. Nach meinem Verständnis sollte jede Route, die nicht zu einem Asset aufgelöst wird (wie js, css, images, ect), der HTML-Datei (index.html) dienen.

Dem Rat von Ktoso folgend, habe ich den Code überarbeitet und der Dokumentation gefolgt ... sehe meine Antwort für die Arbeitsversion, ohne Abstriche zu machen.

+0

Ich verstehe nicht ganz, was Sie von dem Code erwarten. Es hat nichts damit zu tun, einen Zustand AFAICS zu drücken, und es verwendet Abweisungen falsch, lesen Sie bitte in der Dokumentation http://doc.akka.io/docs/akka/2.4.8/scala/http/routing-dsl /directives/execution-directives/handleRejections.html#handlerejections –

Antwort

0

Mit akka-http-Router, ich stehe statischen Inhalt von der Wurzel path("/") jedoch möchte ich wiederherstellen, wenn eine Ressource nicht gefunden wird. Zum Beispiel verwendet meine Anwendung den HTML5-Druckstatus, um den anzuzeigenden Inhalt zu bestimmen. Nach meinem Verständnis sollte jede Route, die nicht zu einem Asset aufgelöst wird (wie js, css, images, ect), der HTML-Datei (index.html) dienen.

Anstatt alle möglichen Inhaltstypen und Verzeichnisse zu behandeln, mache ich etwas ähnliches wie eine gängige ExpressJS-Praxis.

beachten Sie, dass ich andere Router mit unterschiedlichen Pfadpräfixe habe. Derzeit arbeiten alle wie erwartet vom Kunden.

das Hauptproblem ist, dass die Richtlinie getFromDirectory nicht in meinem rejectionHandler arbeiten:

val rejectRecovery = RejectionHandler.newBuilder() 
    .handleNotFound { 
     complete { 
      val file = new File("app/index.html") 
      HttpEntity(ContentTypes.`text/html(UTF-8)`, file.length(), FileIO.fromPath(file.toPath)) 
     } 
     // alternatively 
     // getFromFile("app/index.html") 
    } 
    .result() 

def router = pathPrefix("") { 
    get { 
     pathEndOrSingleSlash { 
      getFromDirectory("app/index.html") 
     } ~ handleRejections(rejectRecovery) { 
      getFromDirectory("app") 
     } 
    } 
} 

Dies funktioniert genau wie erwartet. Mein erster Versuch war, den Builder innerhalb der handleRejections-Direktive zu definieren, was ohnehin nicht gut ist.