Введение в запросы к API в Kotlin
Веб-API часто отвечает не HTML, а текстом JSON. Клиент
JDK получает его как обычную строку в теле ответа,
после чего ту же строку передают кодеку
kotlinx.serialization.
Публичный каталог jsonplaceholder.typicode.com
отдает записи пользователей. Достаточно одного чтения
по адресу "/users/1", затем разбор только
нужных полей:
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 UserPreview(val id: Int, val name: String)
fun main() {
val json = Json { ignoreUnknownKeys = true }
val client = HttpClient.newBuilder().build()
val request = HttpRequest.newBuilder()
.uri(
URI.create(
"https://jsonplaceholder.typicode.com/users/1",
),
)
.GET()
.build()
val response = client.send(
request,
HttpResponse.BodyHandlers.ofString(),
)
val raw = response.body()
val user = json.decodeFromString<UserPreview>(raw)
println(user.id)
println(user.name)
}
В тексте от сервера есть и другие ключи - почта, адрес,
компания. Настройка ignoreUnknownKeys = true
у экземпляра Json пропускает лишние поля,
если в UserPreview описаны только
id и name.
Тот же прием работает, если в модели оставить идентификатор и почту вместо имени - лишние ключи по-прежнему не мешают:
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 UserMail(val id: Int, val email: String)
fun main() {
val json = Json { ignoreUnknownKeys = true }
val client = HttpClient.newBuilder().build()
val request = HttpRequest.newBuilder()
.uri(
URI.create(
"https://jsonplaceholder.typicode.com/users/1",
),
)
.GET()
.build()
val response = client.send(
request,
HttpResponse.BodyHandlers.ofString(),
)
val user = json.decodeFromString<UserMail>(
response.body(),
)
println(user.email)
}