2017-02-20 11 views
1

akka-http(高レベルDSL)でカスタム404ページを作成したいと思います。これは基本的に意味しますAkka-httpカスタム404ページ

  1. 戻り、私がこれまで試したどのよう

をResultCodes.NOT_FOUNDする結果コードを設定して、私の静的なフォルダ(例:リソース/ WWW/404.html)

  • からのページ:

    1. getFromResource - エンティティを返すことができますが、レスポンスのHTTP結果コードをオーバーライドする方法がわからないので、「404」に設定することができます。
    2. complete() - 正しいコードを返すことができますが、手動でhtmlページを読み込み、HttpResponseを一から構築する必要があります。最終的には機能しますが、少し面倒です。

    何か不足していますか?ページを返して結果コードをカスタマイズする簡単な方法はありますか?

  • 答えて

    1

    HttpResponseentityとして静的ページを返すことができます。あなたはあなたが障害の発生時に静的なページを使用したいと思うでしょうフォーム

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

    @willIAmよろしくお願いいたします。私はそれが "1ライナー"ほどシンプルではないことに同意しますが、それがどうなるかはわかりません。エンティティを使用して404レスポンスを作成することは、エンティティを使用して400レスポンスを作成することとまったく同じです。パターンに十分な相違があるので、図書館が冗長性を大幅に向上させるとは思えません。私はutilライブラリ関数のようにするための答えを更新しました。少なくとも、一度だけ書く必要があります... –

    +0

    私は誤って以前のコメントを削除しました(ただし、重要なことはありませんでした。それは非常に簡単ではないと不平を言った:)。ところで、あなたのコードでは、staticResponse = ...(期待されるSeq [HttpHeader]、実際のHttpEnttity.Chunked)のコンパイルエラーが発生します。 –

    +0

    @WillIAm答えが更新され、コンパイルエラーが修正されました。 –

    0

    、これはWELとしてjarファイル内で動作しますl:

    def createChunkedSource(fileName : String): Chunked = { 
        def createStaticSource(fileName : String) : Source[ChunkStreamPart, Any] = { 
         val classLoader = getClass.getClassLoader 
         StreamConverters.fromInputStream(() => classLoader.getResourceAsStream(fileName)).map(ChunkStreamPart.apply) 
        } 
        Chunked(ContentTypes.`text/html(UTF-8)`, createStaticSource(fileName)) 
        } 
    
    関連する問題