靜態頁面可以作爲HttpResponse
的entity
返回。
假設你已經形式
def someFunctionThatCanFail() : Try[HttpResponse] = ???
你會希望在發生故障的情況下,使用您的靜態頁面的一些功能。首先,您需要創建一個基於靜態頁面上Source
:
import akka.stream.scaladsl._
import akka.http.scaladsl.model.HttpEntity.Chunked
def createStaticSource(fileName : String) =
FileIO
.fromPath(Paths get fileName)
.map(ChunkStreamPart.apply)
def createChunkedSource(fileName : String) =
Chunked(ContentTypes.`text/html(UTF-8)`, createStaticSource(fileName))
這個源可以被放置響應的內部:
def staticResponse =
HttpResponse(status = StatusCodes.NotFound,
entity = createChunkedSource("resources/www/404.html"))
唯一剩下要做的就是要麼返回函數的結果,如果它是有效的還是在發生故障的情況下,靜態響應:
val route =
get {
complete(someFunctionThatCanFail() getOrElse staticResponse)
}
@WillIAm歡迎您。我同意這不像「單線」那麼簡單,但我不明白這是如何實現的。使用實體創建404響應與創建實體的400響應完全相同。模式中有足夠的分歧,我不認爲圖書館可以提高冗長度。我更新了答案,使其更像是一個util庫函數,至少你只需要編寫一次... –
糟糕,我刪除了我以前的評論(但沒有什麼重要的東西,只是感謝和抱怨說這不是很簡單:)。順便說一句,你的代碼我得到一個編譯錯誤在線staticResponse = ...(期望Seq [HttpHeader],實際HttpEnttity.Chunked) –
@WillIAm回答更新修復編譯錯誤。 –