Ktor - маршрутизация статического контента

Я хотел бы лучше понять, как Ktor обрабатывает маршрутизацию для статического контента. В моей статической папке (рабочем каталоге) есть следующая иерархия:

- static
 - index.html
 - (some files)
 - static
  - css (directory)
  - js (directory)
  - (some files)

Я хочу служить им всем. Итак, я использовал непосредственно этот код в routing:

static {
  defaultResource("index.html", "static")
  resources("static")
}

Что работает очень хорошо, но проблема в том, что он принимает участие во всех запросах, включая мой маленький get:

get("/smoketest"){
  call.respondText("smoke test!", ContentType.Text.Plain)
}

Что было бы лучше всего для обработки статического контента в Ktor?

Вот код

Спасибо


person Vlad    schedule 18.06.2018    source источник
comment
Что вы имеете в виду, когда берете за руку?   -  person avolkmann    schedule 20.06.2018
comment
Я не могу попасть в эту конечную точку / дымовой тест. Меня всегда перенаправляют на index.html. Спасибо за помощь!   -  person Vlad    schedule 20.06.2018
comment
Можете выложить полную настройку маршрутизации? Кроме того, какая у вас версия ktor?   -  person avolkmann    schedule 20.06.2018
comment
Я поместил ссылку в конце поста. Еще раз спасибо за помощь   -  person Vlad    schedule 21.06.2018


Ответы (1)


Я попытался воспроизвести его локально и заставил его работать двумя разными подходами.

  1. Поместите один из них в свой статический блок
file("*", "index.html") // single star will only resolve the first part

file("{...}", "index.html") // tailcard will match anything
  1. Или поместите следующий обработчик get в качестве последнего маршрута:
val html = File("index.html").readText()
get("{...}") {
     call.respondText(html, ContentType.Text.Html)
}

{...} является хвостовой картой и соответствует любому запросу, который еще не был сопоставлен.

Документация доступна здесь: http://ktor.io/features/routing.html#path

Изменить: для ресурсов я сделал следующую работу:

fun Route.staticContent() {
    static {
        resource("/", "index.html")
        resource("*", "index.html")
        static("static") {
            resources("static")
        }
    }
}

Я не вижу ваши статические файлы в репозитории, поэтому вот как они выглядят в моем проекте: введите описание изображения здесь

person avolkmann    schedule 21.06.2018
comment
Привет, Андреас! Большое спасибо за быстрый ответ. Хотя первый у меня не сработал, отображение index.html со вторым сработало (и это хороший трюк с этой хвостовой картой). К сожалению, я не могу найти способ загрузить все ресурсы, которые у меня есть в этом index.html (например, файл js в папке static / js на уровне индекса). У вас есть дополнительный код для этого? (вы можете проверить мой код еще раз, чтобы увидеть, что я пробовал) - person Vlad; 21.06.2018
comment
Я также использую этот код для обслуживания ресурсов, которые требуются в index.html: static("static") { files(File("app/static")) } - person avolkmann; 21.06.2018
comment
Большое спасибо за вашу помощь и ответ! Работает как часы - person Vlad; 24.06.2018
comment
Красиво работает. Структура папок очень помогла! - person Dhruvam Sharma; 13.12.2019