Spark возвращает пустой ответ при посещении маршрута при включении CORS в Kotlin

#java #kotlin #spark-java

#java #kotlin #spark-java

Вопрос:

Вот мой CorsRoute, взятый непосредственно из документации Spark:

 class CorsRoute(origin: String, methods: String, headers: String) {
    init {
        options("/*") { request, response ->

            val accessControlRequestHeaders = request.headers("Access-Control-Request-Headers")
            if (accessControlRequestHeaders != null) {
                response.header("Access-Control-Allow-Headers", accessControlRequestHeaders)
            }

            val accessControlRequestMethod = request.headers("Access-Control-Request-Method")
            if (accessControlRequestMethod != null) {
                response.header("Access-Control-Allow-Methods", accessControlRequestMethod)
            }

            "OK"
        }

        before { request, response ->
            response.header("Access-Control-Allow-Origin", origin)
            response.header("Access-Control-Request-Method", methods)
            response.header("Access-Control-Allow-Headers", headers)
            response.type("application/json")
        }
    }
}
  

Вот как я создаю экземпляр CorsRoute:

 abstract class Route {
    init {
        CorsRoute("*","*","*")
    }
}
  

Вот как я начинаю свои маршруты:

 class RestApiRoutes : Route() {
    fun init() {
        get("/test") {
            req, res -> {
                val obj = JsonObject().addProperty("foo", "bar")
                Gson().toJson(obj).toString()
            }
        }
    }
}
  

Когда я перехожу к http://127.0.0.1:4567/test получению:

() -> kotlin.Строка

Почему страница возвращает это, а не мой ожидаемый ответ JSON?

Ответ №1:

Потому что

 {
    req, res -> {
        val obj = JsonObject().addProperty("foo", "bar")
        Gson().toJson(obj).toString()
    }
}
  

это лямбда-выражение, которое возвращает лямбда-выражение без аргументов, а не a String . И это toString возвращает внутреннюю лямбду () -> kotlin.String .

Удалите внутренний {} , чтобы устранить проблему:

 { req, res ->
    val obj = JsonObject().addProperty("foo", "bar")
    Gson().toJson(obj).toString()
}
  

(см https://kotlinlang.org/docs/reference/coding-conventions.html#lambda-formatting для соглашений о форматировании)

Комментарии:

1. Понял это, но забыл дать ответ, вот что я сделал — спасибо за ответ! Помечено принято для будущих зрителей!