Kotlin KTOR Webclient+embedded

0

Cześć wszystkim,

Podchodzę drugi raz do Kotlina za pierwszym się nie polubiliśmy.. ale teraz mam dość uciążliwy problem.

Tworze sobie endpoint, potem webclientem wysyłam sobie endpoint do stackexchange który mi zwraca jakieś dane i dostaję:

19:03:38.270 [eventLoopGroupProxy-4-1 @call-handler#7] INFO ktor.application - Unhandled: GET - /, io failed

kod

suspend fun main() {
    embeddedServer(Netty, port = 8000) {
        routing {
            get("/") {
                val response = client.get<String>("https://api.stackexchange.com/2.2/search?order=desc&sort=activity&site=stackoverflow&intitle=java")
                call.respondText { response }
            }
            post("/add-exception") {

            }
        }
    }.start(wait = true)
}

Próbowałem również w coroutinach(znalazłem na stacku):

suspend fun getData() = coroutineScope<Unit> {
    val response = client.get<HttpResponseData>("https://api.stackexchange.com/2.2/search?order=desc&sort=activity&site=stackoverflow&intitle=java")
    logger.info(response.statusCode.toString())
}

nie wiem jak co z tym zrobić...

1

Brakuje Ci:

 install(ContentEncoding) {
            gzip()
        }

Ale ponieważ nie chciało Ci się podać istotnych kawałków kodu(projektu), więc i ja sobie zatrzymam swoje sekrety. Kombinuj - względnie łatwe do wygóglania.

0

@jarekr000000:
całość

private val client = HttpClient {
    install(JsonFeature) {
        serializer = KotlinxSerializer()
    }
}
fun main() {
    embeddedServer(Netty, port = 8000) {
        routing {
            get("/") {
                val response = client.get<HttpResponseData>("https://api.stackexchange.com/2.2/search?order=desc&sort=activity&site=stackoverflow&intitle=java")
                call.respond(response.body)
            }

        }
    }.start(wait = true)
}

nie znalazłem nic poza tym:
https://ktor.io/docs/compression.html#configure_content_type
które oczywiscie gzip nie dziala nie wiem z jakiego package to wziac i rowniez nie widze w dokumentacji..

1

Ok - to dodaj do build.gradle.kts (dependencies)

implementation("io.ktor:ktor-client-encoding-jvm:1.5.2")

a w pliku .kt

import io.ktor.client.features.compression.ContentEncoding

...

private val client = HttpClient {
    install(JsonFeature) {
        serializer = KotlinxSerializer()
    }
    install(ContentEncoding) {
            gzip()
    }
}
0

Ok - poszło super, teraz to
Caused by: kotlinx.serialization.SerializationException: Serializer for class 'HttpResponseData' is not found.

Czy cos trzeba dodac do JsonFeature jeszcze albo cos takiego? rowniez z modelem takim:

data class Model(val items: List<Item>)
data class Item(val tags: List<String>)

ten sam blad
Rozumiem ze gdzies trzeba dac @Serializable ale jak sie to ma do klasy kotlinowej: HttpResponseData

1 użytkowników online, w tym zalogowanych: 0, gości: 1