Ошибочный ответ API в Java
Число в statusCode() не всегда равно
200. Ошибочный ответ может содержать HTML
или короткое сообщение, которое не стоит
превращать в record как при успехе.
Сервис "/status/404" на httpbin специально
возвращает «не найдено». Сначала проверяют код,
и только при 200 разбирают тело:
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;
public record EchoNote(String note) {}
public class Main {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newBuilder().build();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://httpbin.org/status/404"))
.GET()
.build();
HttpResponse<String> response = client.send(
request,
HttpResponse.BodyHandlers.ofString(),
);
int code = response.statusCode();
if (code == 200) {
ObjectMapper mapper = new ObjectMapper();
EchoNote note = mapper.readValue(
response.body(),
EchoNote.class,
);
System.out.println(note.note());
} else {
System.out.println(code);
}
}
}
Локальная строка с синтаксической ошибкой JSON вызывает исключение Jackson. Его перехватывают, чтобы программа завершилась штатно и напечатала текст причины:
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.List;
public class Main {
public static void main(String[] args) {
String broken = "[\"a\", \"b\", \"c\",]";
ObjectMapper mapper = new ObjectMapper();
try {
List<String> items = mapper.readValue(
broken,
new TypeReference<List<String>>() {},
);
System.out.println("ok");
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
}
Дан код:
String json = "[1, 2,";
Попытайтесь получить из неё список строк. Выведите результат или текст ошибки, не прерывая работу программы аварийно.