Введение в запросы к API в Dart
Веб-API часто отвечает не HTML, а текстом JSON. Клиент
на Dart получает его как строку в response.body,
после чего ту же строку передают в jsonDecode
из dart:convert.
Сетевой обмен удобно делать пакетом http:
метод http.get принимает Uri,
а результат ждут через await внутри
main с пометкой async.
Публичный каталог jsonplaceholder.typicode.com
отдает записи пользователей. Достаточно одного чтения
по адресу "/users/1", затем разбор только
нужных полей:
import 'package:http/http.dart' as http;
import 'dart:convert';
class UserPreview {
UserPreview(this.id, this.name);
final int id;
final String name;
factory UserPreview.fromJson(Map<String, Object?> json) {
return UserPreview(
json['id'] as int,
json['name'] as String,
);
}
}
void main() async {
var response = await http.get(
Uri.parse(
'https://jsonplaceholder.typicode.com/users/1',
),
);
var raw = jsonDecode(response.body);
if (raw is Map<String, Object?>) {
var user = UserPreview.fromJson(raw);
print(user.id);
print(user.name);
}
}
В тексте от сервера есть и другие ключи - почта, адрес,
компания. Фабрика fromJson читает только
id и name, лишние ключи в карте
не мешают разбору.
Тот же прием работает, если в модели оставить идентификатор и почту вместо имени - лишние ключи по-прежнему не мешают:
import 'package:http/http.dart' as http;
import 'dart:convert';
class UserMail {
UserMail(this.id, this.email);
final int id;
final String email;
factory UserMail.fromJson(Map<String, Object?> json) {
return UserMail(
json['id'] as int,
json['email'] as String,
);
}
}
void main() async {
var response = await http.get(
Uri.parse(
'https://jsonplaceholder.typicode.com/users/1',
),
);
var raw = jsonDecode(response.body);
if (raw is Map<String, Object?>) {
var user = UserMail.fromJson(raw);
print(user.email);
}
}