2016-07-10 105 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,images等)都應爲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,images等)都應爲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指令中定義構建器,反正這不是好習慣。