Kotlin Ktor API - PullRequest
       21

Kotlin Ktor API

0 голосов
/ 22 марта 2019

Для учебы у меня есть небольшой API для разработки с использованием Kotlin и Ktor.Цель - показать информацию JSON при запуске приложения.Информация должна быть видна, когда у нас есть http://127.0.0.1:8080/course/{id} в нашем веб-браузере.Идентификатор - это некоторый идентификатор курса, который может быть равен, например, 1,2,3, если идентификатор отличается от идентификатора ошибки, отображаемого в браузере.

Мой код сегодня

fun main(args: Array<String>): Unit = 
io.ktor.server.netty.EngineMain.main(args)

@Suppress("unused") // Referenced in application.conf
@kotlin.jvm.JvmOverloads
fun Application.module(testing: Boolean = false) {


install(ContentNegotiation) {
    jackson {
        enable(SerializationFeature.INDENT_OUTPUT)
    }
}

routing {
    get("/") {
        call.respondText("Welcome to OpenClassrooms brand new server !", contentType = ContentType.Text.Plain)
    }

    get("/course/top") {
        call.respond(mapOf("id" to courses[0].id, "title" to courses[0].title, "level" to courses[0].level, "isActive" to courses[0].isActive))
    }

    for (i in 0..2){
        get("/course/${i.addOneToInt()}") {
            call.respond(mapOf("id" to courses[i].id, "title" to courses[i].title, "level" to courses[i].level, "isActive" to courses[i].isActive))
        }
    }
}
}

data class Course(val id: Int, val title: String, val level: Int, val isActive: Boolean)

val courses = Collections.synchronizedList(listOf(
Course(1, "How to troll a Troll?",5,true),
Course(2, "Kotlin for Troll",1,true),
Course(3, "Kotlin vs Java",3,true))
)

Я не очень дружу с kotlin и ktor.Приложение работает на данный момент, но я не знаю, как покрыть сообщение об ошибке, когда идентификатор не равен 1,2,3.например, если у меня http://127.0.0.1:8080/course/4, у меня ошибка, указывающая, что страница сайта недействительна.Вместо этого я хотел бы показать:

call.respond(mapOf("status" to "404", "message: no course found!"))

Может ли кто-нибудь мне помочь?

Спасибо

Ответы [ 2 ]

1 голос
/ 22 марта 2019

В этом случае Ktor уже отвечает «404 not found».

Тем не менее, если вы хотите добавить собственное сообщение, удалите цикл for и замените его параметром URL.

Затем создайте свой собственный ответ, если идентификатор курса не найден.

routing {

    // .....

    get("/course/{courseId}") {
        val i = call.parameters["courseId"]!!.toInt() - 1
        if (i < 0 || i >= courses.size) {
            call.respond(HttpStatusCode.NotFound, "no course found!")
        } else {
            call.respond(
                mapOf(
                    "id" to courses[i].id,
                    "title" to courses[i].title,
                    "level" to courses[i].level,
                    "isActive" to courses[i].isActive
                )
            )
        }
    }

}
0 голосов
/ 22 апреля 2019

Я согласен с ответом Эггера, но не думаю, что вам нужно было бы указывать сопоставленные поля, если вы собираетесь просто перевести весь объект в JSON.Вы можете просто ответить самим объектом и позволить Ktor обработать его.

routing {

    // .....

    get("/course/{courseId}") {
        val i = call.parameters["courseId"]!!.toInt() - 1
        if (i < 0 || i >= courses.size) {
            call.respond(HttpStatusCode.NotFound, "no course found!")
        } else {
            call.respond(courses[i])
        }
    }

}
...