Ошибочный ответ API в Dart
Число в statusCode не всегда равно
200. Ошибочный ответ может содержать HTML
или короткое сообщение, которое не стоит
разбирать через fromJson как при успехе.
Сам по себе код ошибки не выбрасывает исключение -
его проверяют явно.
Сервис "/status/404" на httpbin специально
возвращает "не найдено". Сначала проверяют код,
и только при 200 разбирают тело:
import 'package:http/http.dart' as http;
import 'dart:convert';
class EchoNote {
EchoNote(this.note);
final String note;
factory EchoNote.fromJson(Map<String, Object?> json) {
return EchoNote(json['note'] as String);
}
}
void main() async {
var response = await http.get(
Uri.parse('https://httpbin.org/status/404'),
);
var code = response.statusCode;
if (code == 200) {
var raw = jsonDecode(response.body);
if (raw is Map<String, Object?>) {
var note = EchoNote.fromJson(raw);
print(note.note);
}
} else {
print(code);
}
}
Локальная строка с синтаксической ошибкой JSON
вызывает исключение при jsonDecode. Его
перехватывают, чтобы программа завершилась штатно
и напечатала текст причины:
import 'dart:convert';
void main() {
var broken = '["a", "b", "c",]';
try {
var raw = jsonDecode(broken);
if (raw is List<Object?>) {
raw.map((e) => e as String).toList();
}
print('ok');
} catch (ex) {
print(ex);
}
}
Дана строка с некорректным JSON. Попытайтесь получить из нее список строк. Выведите результат или текст ошибки, не прерывая работу программы аварийно.