Введение в запросы к API в Java
Веб-API часто отвечает не HTML, а текстом JSON. Клиент
JDK получает его как обычную строку в теле ответа,
после чего ту же строку передают методу
readValue у ObjectMapper.
Публичный каталог jsonplaceholder.typicode.com
отдает записи пользователей. Достаточно одного чтения
по адресу "/users/1", затем разбор только
нужных полей:
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
@JsonIgnoreProperties(ignoreUnknown = true)
public record UserPreview(int id, String name) {}
public class Main {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
HttpClient client = HttpClient.newBuilder().build();
HttpRequest request = HttpRequest.newBuilder()
.uri(
URI.create(
"https://jsonplaceholder.typicode.com/users/1",
),
)
.GET()
.build();
HttpResponse<String> response = client.send(
request,
HttpResponse.BodyHandlers.ofString(),
);
String raw = response.body();
UserPreview user = mapper.readValue(raw, UserPreview.class);
System.out.println(user.id());
System.out.println(user.name());
}
}
В тексте от сервера есть и другие ключи: почта, адрес,
компания. Аннотация @JsonIgnoreProperties(ignoreUnknown = true)
на record пропускает лишние поля, если в модели
описаны только id и name.
Тот же прием работает, если в модели оставить идентификатор и почту вместо имени. Лишние ключи по-прежнему не мешают:
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
@JsonIgnoreProperties(ignoreUnknown = true)
public record UserMail(int id, String email) {}
public class Main {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
HttpClient client = HttpClient.newBuilder().build();
HttpRequest request = HttpRequest.newBuilder()
.uri(
URI.create(
"https://jsonplaceholder.typicode.com/users/1",
),
)
.GET()
.build();
HttpResponse<String> response = client.send(
request,
HttpResponse.BodyHandlers.ofString(),
);
UserMail user = mapper.readValue(
response.body(),
UserMail.class,
);
System.out.println(user.email());
}
}