django_rest + angulardart
Подскажите пожалуйста что не так? делаю по оф мануалу с сайта оф.дока
получаю такую ошибку "Exception: Server error; cause: Expected a value of type 'int', but got one of type 'String'"
материал учебника был не много изменен, и расширен
advert.dart => hero.dart
class Advert {
final int id;
String title, owner, description, date;
Advert(this.id, this.title, this.owner, this.description, this.date);
factory Advert.fromJson(Map<String, dynamic> advert) =>
Advert(_toInt(advert['id']), advert['title'], advert['owner'],
advert['description'], advert['date']);
Map toJson() => {'id': id, 'title': title, 'owner': owner,
'description': description, 'date': date};
}
int _toInt(id) => id is int ? id : int.parse(id);
advert_service.dart это hero_service.dart
import 'dart:async';
import 'dart:convert';
import 'package:http/http.dart';
import 'advert.dart';
class AdvertService {
static final _headers = {'Content-Type': 'application/json'};
static const _advertsUrl = 'http://127.0.0.1:8000/adverts/';
final Client _http;
AdvertService(this._http);
Future<List<Advert>> getAll() async {
try {
final response = await _http.get(_advertsUrl);
final adverts = (_extractData(response) as List)
.map((value) => Advert.fromJson(value))
.toList();
return adverts;
} catch (e) {
throw _handleError(e);
}
}
Future<Advert> create(String title) async {
try {
final response = await _http.post(_advertsUrl,
headers: _headers, body: json.encode({'title': title}));
return Advert.fromJson(_extractData(response));
} catch (e) {
throw _handleError(e);
}
}
dynamic _extractData(Response resp) => json.decode(resp.body)['data'];
Exception _handleError(dynamic e) {
print(e); // for demo purposes only
return Exception('Server error; cause: $e');
}
}
терминал PyCharm, говорит что запросы идут и код ответа 200 то есть тут вроде все ок
[09/Feb/2020 11:45:48] "GET /adverts/ HTTP/1.1" 200 492

json
[{"id":1,"owner":"admin","title":"testing drf","description":"my one project django3+angulardart","date":"2020-02-05T19:35:42.235726+05:00"},{"id":2,"owner":"tester","title":"Реальные упыри","description":"Норм кинчик","date":"2020-02-06T22:29:57.479338+05:00"},{"id":3,"owner":"tester","title":"Создам сайт","description":"говнокодер напишет пахнущий код за ваши бабосики","date":"2020-02-06T22:30:30.832407+05:00"}]
Ответы (2 шт):
Попробуйте так (только ничего не меняйте):
class Advert {
int id;
String owner;
String title;
String description;
DateTime date;
Advert({
this.id,
this.owner,
this.title,
this.description,
this.date,
});
factory Advert.fromJson(Map<String, dynamic> json) => Advert(
id: json["id"],
owner: json["owner"],
title: json["title"],
description: json["description"],
date: DateTime.parse(json["date"]),
);
Map<String, dynamic> toJson() => {
"id": id,
"owner": owner,
"title": title,
"description": description,
"date": date.toIso8601String(),
};
}
dynamic _extractData(Response resp) => json.decode(resp.body)['data']; из это строки нужно удалить вот этот фрагмент ['data'] и все заработает, ну или править генерацию json в drf что бы он подставлял его туда, ибо ангуляр ждет json вида
{
"data": [
{ "id": "1", "name": "Windstorm" },
{ "id": "2", "name": "Bombasto" },
{ "id": "3", "name": "Magneta" },
{ "id": "4", "name": "Tornado" }
]
}
если кто знает как в дрф сформировать такой json я с радостью почитаю.