Ошибочный ответ API в Kotlin
Число в statusCode не всегда равно
200. Ошибочный ответ может содержать HTML
или короткое сообщение, которое не стоит
превращать в data class как при успехе.
Сервис "/status/404" на httpbin специально
возвращает «не найдено». Сначала проверяют код,
и только при 200 разбирают тело:
import java.net.URI
import java.net.http.HttpClient
import java.net.http.HttpRequest
import java.net.http.HttpResponse
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json
@Serializable
data class EchoNote(val note: String)
fun main() {
val client = HttpClient.newBuilder().build()
val request = HttpRequest.newBuilder()
.uri(URI.create("https://httpbin.org/status/404"))
.GET()
.build()
val response = client.send(
request,
HttpResponse.BodyHandlers.ofString(),
)
val code = response.statusCode()
if (code == 200) {
val note = Json.decodeFromString<EchoNote>(
response.body(),
)
println(note.note)
} else {
println(code)
}
}
Локальная строка с синтаксической ошибкой JSON вызывает исключение сериализации. Его перехватывают, чтобы программа завершилась штатно и напечатала текст причины:
import kotlinx.serialization.json.Json
fun main() {
val broken = """["a", "b", "c",]"""
try {
Json.decodeFromString<List<String>>(broken)
println("ok")
} catch (ex: Exception) {
println(ex.message)
}
}
Дана строка с некорректным JSON. Попытайтесь получить из неё список строк. Выведите результат или текст ошибки, не прерывая работу программы аварийно.