Отправка JSON в Kotlin
Создание записи на API часто требует метода POST и
тела в формате JSON. Текст тела получают из модели
через кодек, а в запросе задают заголовок
"Content-Type: application/json".
Учебный "/posts" на typicode принимает
черновик с userId, title и
body. Ответ можно прочитать как строку
или разобрать в тип с полем id:
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 NewPost(
val userId: Int,
val title: String,
val body: String,
)
@Serializable
data class SavedPost(val id: Int, val title: String)
fun main() {
val json = Json { ignoreUnknownKeys = true }
val draft = NewPost(
userId = 1,
title = "Note",
body = "Short text",
)
val payload = json.encodeToString(draft)
val client = HttpClient.newBuilder().build()
val request = HttpRequest.newBuilder()
.uri(
URI.create(
"https://jsonplaceholder.typicode.com/posts",
),
)
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(payload))
.build()
val response = client.send(
request,
HttpResponse.BodyHandlers.ofString(),
)
val saved = json.decodeFromString<SavedPost>(
response.body(),
)
println(saved.id)
println(saved.title)
}
Сервис httpbin.org/post возвращает принятое
тело внутри JSON-ответа. Массив чисел кодируют так
же, как одиночный объект, и отправляют одной строкой:
import java.net.URI
import java.net.http.HttpClient
import java.net.http.HttpRequest
import java.net.http.HttpResponse
import kotlinx.serialization.json.Json
fun main() {
val numbers = (1..5).toList()
val payload = Json.encodeToString(numbers)
val client = HttpClient.newBuilder().build()
val request = HttpRequest.newBuilder()
.uri(URI.create("https://httpbin.org/post"))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(payload))
.build()
val response = client.send(
request,
HttpResponse.BodyHandlers.ofString(),
)
println(response.body())
}
Сформируйте JSON-массив чисел от 1 до
5, отправьте его POST на
"https://httpbin.org/post" с типом
"application/json". Выведите тело
ответа целиком или фрагмент с принятыми
данными.