2017-02-20 89 views
1

我想在akka-http(高级DSL)中创建一个定制的404页面。这基本上意味着:Akka-http定制404页面

  1. 返回从我的静态文件夹页(如资源/网络/ 404.html)
  2. 将结果代码ResultCodes.NOT_FOUND

我试过到目前为止什么:

  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欢迎您。我同意这不像“单线”那么简单,但我不明白这是如何实现的。使用实体创建404响应与创建实体的400响应完全相同。模式中有足够的分歧,我不认为图书馆可以提高冗长度。我更新了答案,使其更像是一个util库函数,至少你只需要编写一次... –

+0

糟糕,我删除了我以前的评论(但没有什么重要的东西,只是感谢和抱怨说这不是很简单:)。顺便说一句,你的代码我得到一个编译错误在线staticResponse = ...(期望Seq [HttpHeader],实际HttpEnttity.Chunked) –

+0

@WillIAm回答更新修复编译错误。 –

0

要在拉蒙的出色答卷扩大,这个工作的jar文件里面WEL 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)) 
    }