Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗ktSpApInr 260 of 299 menu
◀ ▶

Введение в запросы к 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) }
← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить