2017-02-20 14 views
1

Я хотел бы создать пользовательскую страницу 404 в akka-http (DSL высокого уровня). В основном это означает:Akka-http custom 404 страница

  1. Возврат страницы из моей статической папки (например, ресурсы/WWW/404.html)
  2. Установите код результата в ResultCodes.NOT_FOUND

То, что я пытался до сих пор:

  1. getFromResource - я могу вернуть объект, но я не могу понять, как переопределить код результата HTTP для ответа, поэтому я могу установить его на «404».
  2. complete() - Я могу вернуть правильный код, но мне нужно прочитать html-страницу вручную и построить HttpResponse с нуля. В конечном итоге это работает, но это немного громоздко.

Я что-то упустил? Есть ли более простой способ вернуть страницу и настроить код результата?

ответ

1

Статическая страница может быть возвращена как entityHttpResponse.

Предполагая, что вы какая-то функция вида

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

К сожалению, я удалил свой предыдущий комментарий по ошибке (но не было ничего важного, просто спасибо и жалуясь, что это было не очень просто :). BTW, на ваш код я получаю ошибку компиляции в строке staticResponse = ... (ожидается Seq [HttpHeader], фактический HttpEnttity.Chunked) –

+0

@WillIAm Ответ обновлен, чтобы исправить ошибку компиляции. –

0

Чтобы расширить на отличный ответ Рамона, это работает в баночке файл как вэй l: