2016-07-10 6 views
0

Akka-HTTP(2.4.7)からフロントエンドにアクセスできるようにしようとしています。すべては通常のルートでうまく動作しますが、HTML5 PushStateサポートを有効にする方法を理解できません。私の最善の試みは、RejectionHandlerとhandleRejectionディレクティブを使用することでした。拒否からのAkka-HTTPリカバリ(HTML5履歴APIルーティング用)

誰でもそれを正しく得るための提案はありますか?

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

私は、ルートpath("/")から静的コンテンツを提供していますが、私は、リソースが見つからない場合回復します。たとえば、私のアプリケーションはHTML5のpushstateを使って表示するコンテンツを決定します。私の理解では、資産(js、css、画像、ectなど)に解決されないルートはHTMLファイル(index.html)を提供する必要があります。

ktosoのアドバイスに続いて、私はコードをリファクタリングし、ドキュメントに従っています...コーナーをカットすることなく、作業バージョンの答えを見てください。

+0

私はあなたがコードから何を期待しているのかよく分かりません。 AFAICSの状態をプッシュすることと何ら関係がなく、誤った拒否を使用しています。ドキュメントhttp://doc.akka.io/docs/akka/2.4.8/scala/http/routing-dslを参照してください。 /directives/execution-directives/handleRejections.html#handlerejections –

答えて

0

akka-httpルータを使用すると、ルートから静的コンテンツを配信していますpath("/")しかし、リソースが見つからないときに回復したいです。たとえば、私のアプリケーションはHTML5のpushstateを使って表示するコンテンツを決定します。私の理解では、資産(js、css、画像、ectなど)に解決されないルートはHTMLファイル(index.html)を提供する必要があります。

可能なすべてのコンテンツタイプとディレクトリを処理するのではなく、一般的なExpressJSのプラクティスと同様のことをやっています。

私は異なるパスプレフィックスを持つ他のルータを持っていることに注意してください。現在、彼らはすべてクライアントから期待どおりに動作します。

主な問題は、ディレクティブgetFromDirectoryが私rejectionHandlerで働いていないことである。

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

これは期待どおりに動作します。私の最初の試みは、handleRejections指令の中にビルダーを定義することでした。とにかくそれは良い練習ではありません。

関連する問題