Идентификатор в пути в Kotlin
Шаблон "/posts/{id}" означает, что число
в конце адреса выбирает запись. Строку URI собирают
заранее, подставляя нужный идентификатор в литерал
или через интерполяцию.
Пусть требуется пост с номером 3. После
чтения тела достаточно модели с id и
title:
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 ApiPost(val id: Int, val title: String)
fun main() {
val postId = 3
val json = Json { ignoreUnknownKeys = true }
val client = HttpClient.newBuilder().build()
val address =
"https://jsonplaceholder.typicode.com/posts/$postId"
val request = HttpRequest.newBuilder()
.uri(URI.create(address))
.GET()
.build()
val response = client.send(
request,
HttpResponse.BodyHandlers.ofString(),
)
val post = json.decodeFromString<ApiPost>(
response.body(),
)
println(post.id)
println(post.title)
}
Тот же прием работает для пользователей: меняется
только базовый сегмент и тип модели. Число
2 в пути дает вторую учебную запись:
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 ApiUser(val id: Int, val name: String)
fun main() {
val userId = 2
val json = Json { ignoreUnknownKeys = true }
val client = HttpClient.newBuilder().build()
val address =
"https://jsonplaceholder.typicode.com/users/$userId"
val request = HttpRequest.newBuilder()
.uri(URI.create(address))
.GET()
.build()
val response = client.send(
request,
HttpResponse.BodyHandlers.ofString(),
)
val user = json.decodeFromString<ApiUser>(
response.body(),
)
println(user.name)
}