KtorClient.kt 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. package com.example.modifier.http
  2. import com.example.modifier.Global
  3. import com.example.modifier.http.response.ErrorResponse
  4. import io.ktor.client.HttpClient
  5. import io.ktor.client.call.body
  6. import io.ktor.client.engine.okhttp.OkHttp
  7. import io.ktor.client.plugins.ClientRequestException
  8. import io.ktor.client.plugins.HttpResponseValidator
  9. import io.ktor.client.plugins.contentnegotiation.ContentNegotiation
  10. import io.ktor.client.plugins.defaultRequest
  11. import io.ktor.client.plugins.resources.Resources
  12. import io.ktor.serialization.kotlinx.json.json
  13. import kotlinx.serialization.ExperimentalSerializationApi
  14. import kotlinx.serialization.json.Json
  15. @OptIn(ExperimentalSerializationApi::class)
  16. val KtorClient = HttpClient(OkHttp) {
  17. defaultRequest {
  18. Global.load()
  19. url(Global.serverUrl.endsWith("/").let {
  20. if (it) Global.serverUrl else "${Global.serverUrl}/"
  21. })
  22. }
  23. install(Resources)
  24. install(ContentNegotiation) {
  25. json(Json {
  26. prettyPrint = true
  27. isLenient = true
  28. ignoreUnknownKeys = true
  29. explicitNulls = false
  30. })
  31. }
  32. HttpResponseValidator {
  33. handleResponseExceptionWithRequest { exception, request ->
  34. val clientException =
  35. exception as? ClientRequestException ?: return@handleResponseExceptionWithRequest
  36. val exceptionResponse = clientException.response
  37. val err = exceptionResponse.body<ErrorResponse>()
  38. throw Exception(err.message ?: "Unknown error")
  39. }
  40. }
  41. }