#flutter #dart #request
Вопрос:
Я пытаюсь отправить запрос и HTTP post на серверную часть моего приложения, проблема в том, что, когда я задаю тело запроса, оно задается в виде строки. В настоящее время я работаю с временным интервалом класса.
class TimeSlot {
final String id;
final int year;
final int month;
final int day;
final int hour;
TimeSlot(
{this.year = 0,
this.day = 0,
this.hour = 0,
this.month = 0,
required this.id});
Map toJson() => {'year': year, 'month': month, 'day': day, 'hour': hour};
}
и метод
Future<Tutorship> sendNewTutorship(
List<TimeSlot> timeSlots,
String description,
String tutorshipId,
String courseId,
String studentId) async {
var slots = jsonEncode(timeSlots);
var body = jsonEncode({
'tutorshipId': tutorshipId,
'studentId': studentId,
'courseId': courseId,
'availableSlots': slots,
'description': description
});
print(body);
Map<String, String> headers = {
'Content-type': 'application/json',
'Accept': 'application/json',
};
final response = await http.post(
Uri.parse(Strings.serviceUrl '/tutorships'),
headers: headers,
body: body,
);
if (response.statusCode == 201) {
return Tutorship.fromJson(jsonDecode(response.body));
} else {
throw Exception('Could not create the tutorship');
}
}
Метод печати показывает мне, как анализируется список временных интервалов, и это то, что я хочу:
[{«год»:2021,»месяц»:8,»день»:8,»час»:9}]
Но когда он задан в запросе тела, он изменяется на строку, подобную этой:
«[{«год»: 2021,»месяц»: 8,»день»: 11,»час»: 9}]»
Есть ли какой-нибудь способ избежать такого поведения?
Ответ №1:
Вы кодируете слоты дважды, и вы не преобразуете временные интервалы в список карт, поэтому измените
var slots = jsonEncode(timeSlots);
var body = jsonEncode({
'tutorshipId': tutorshipId,
'studentId': studentId,
'courseId': courseId,
'availableSlots': slots,
'description': description
});
к этому
(также предпочитайте ключевое слово final для определения неизменяемых переменных)
final body = jsonEncode({
'tutorshipId': tutorshipId,
'studentId': studentId,
'courseId': courseId,
'availableSlots': timeSlots.map((x) => x.toMap()).toList(),
'description': description
});
Объяснение о Jsons:
- Кодировка Json означает преобразование карт или списков в строку, и мы называем эту строку Json
- Декодирование Json означает преобразование Json(строки) в то, что было до его кодирования