Rest api flutter get метод работает, а post нет
имеем эту ошибку из ответа сервера имеем эту ошибку из ответа сервера
это модели и api
полный исходный код можно найти здесь https://github.com/alihassan75/project
// To parse this JSON data, do
//
// final task = taskFromJson(jsonString);
import 'dart:collection';
import 'dart:core';
import 'package:flutter/foundation.dart';
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
//List<Task> taskFromJson(String str) => List<Task>.from(json.decode(str).map((x) => Task.fromJson(x)));
//String taskToJson(List<Task> data) => json.encode(List<dynamic>.from(data.map((x) => x.toJson())));
class Project {
Project({
this.id,
required this.project_name,
this.created_at,
// required this.start_date,
//required this.end_date,
required this.user,
});
int? id;
final String? project_name;
DateTime? created_at;
// final DateTime? start_date;
//final DateTime? end_date;
int user;
factory Project.fromJson(Map<String, dynamic> json) => Project(
id: json["id"],
project_name: json["project_name"],
created_at: DateTime.parse(json["created_at"]),
// start_date: DateTime.parse(json["start_date"]),
//end_date: DateTime.parse(json["end_date"]),
user: json["user"],
);
Map<String, dynamic> toJson() => {
"id": id,
"project_name": project_name,
"created_at": created_at?.toIso8601String(),
// "start_date": start_date?.toIso8601String(),
//"end_date": end_date?.toIso8601String(),
"user": user,
};
}
class ProjectProvider with ChangeNotifier{
ProjectProvider(){
this.fetchProject();
}
List<Project> _project = [];
List<Project> get project {
return [..._project];
}
void addProject(Project project) async {
final response = await http.post(Uri.parse('http://mostafahamed.pythonanywhere.com/project/api'),
headers: {"Content-Type": "application/json"}, body: json.encode(project));
if (response.statusCode == 201) {
project.id = json.decode(response.body)['id'];
_project.add(project);
notifyListeners();
print('sucess');
}
else {
print(response.body);
throw Exception('Failed to add project');
}
}
void deleteProject(Project project) async {
final response =
await http.delete(Uri.parse('http://mostafahamed.pythonanywhere.com/project/api${project.id}/'));
if (response.statusCode == 204) {
_project.remove(project);
notifyListeners();
print('sucess');
}
else {
throw Exception('Failed to load tasks');
}
}
fetchProject() async{
final response = await http
.get(Uri.parse('http://mostafahamed.pythonanywhere.com/project/api?format=json'));
if (response.statusCode==200){
var data = json.decode(response.body)as List;
_project=data.map<Project>((json) => Project.fromJson(json)).toList();
notifyListeners();
print('sucess');
}
else {
// If the server did not return a 200 OK response,
// then throw an exception.
throw Exception('Failed to load projects');
}
}
}
здесь я вызываю обратно метод post с функцией добавления данных
это приложение сделано для входа пользователей и просмотра проектов и добавления проектов как todo app на сервере django я могу добавлять проекты и просматривать проекты regstring с почтой администратора с сервера python backend ... в этом приложении я могу только просматривать проекты но не могу добавить новый проект это мой проект для окончания университета так что моя жизнь зависит от этого :D полный исходный код https://github.com/alihassan75/project
Вы не получаете данные "user", потому что вы не сохраняете "user" после входа в систему.
Вам необходимо сохранить пользователя в любом локальном хранилище. Для демонстрационной цели я сохраню его в HIVE
.
- Импортируйте пакет hive в pubspec.yaml hive: ^2.1.0
- В главной функции (перед запуском приложения) инициализируем и открываем ящик "user"
await Hive.initFlutter();
await Hive.openBox('User');
- Вы можете нажать на поле пользователя в функции входа в систему следующим образом.
box = Hive.box('User');
int userId = responseJson['user']['id'];
box.put('user_id', userId);
- Вы можете читать пользователя, когда захотите, вот так.
late Box box;
late int userid;
box = Hive.box('User');
super.initState();
final data = box.get('user_id');
- Теперь вы можете передать данные в http api вызов.
Спасибо