如何在 flutter 中将我的原始数据发送到 Api
how to send my raw data to a Api in flutter
如果我的API需要接受这种类型的数据
{
"name": "myName",
"email": "myEmail,
"phone": "0323456789",
"info": "myDescription",
"social_media": [
{
"link":"First link"
"social_media_id": 1
}
{
"link":"First link"
"social_media_id": 1
}
{
"link":"First link"
"social_media_id": 1
}
]
}
然后我在我的方法中使用以下代码发送该数据,但我得到的响应是(未处理的异常:类型 '_InternalLinkedHashMap' 不是 'Map<String, String>' 类型的子类型)
for(int i=0;i<3;i++)
{
_socialList.add(
{
"link":_controllers[i].text,
"social_media_id": 1,
},);
}
Map<String, dynamic> data={
"name":userNameController.text,
"email":emailController.text,
"phone":phoneController.text,
"info": detailsController.text,
"social_media": _socialList
};
var stream= new http.ByteStream(image.openRead());
stream.cast();
var length= await image.length();
var request= new http.MultipartRequest('POST', url);
request.fields.addAll(data);
var multiPort= new http.MultipartFile('file', stream, length,
filename: image.path);
request.files.add(multiPort);
var response=await request.send();
第 1 步:
Future<List<=UserData>> fetchResults() async {
List< UserData> _results = [];
var url ="---your link----";
var response = await http.get(url);
if (response.statusCode == 200) {
var resultsJson = json.decode(response.body).cast<Map<String,dynamic>>();
await Future.forEach(resultsJson, (element) {
_results.add(UserData.fromJson(element));
});
}
return Future.value(_results);
}
第 2 步:
class UserData {
String? name;
String? email;
String? phone;
String? info;
List<SocialMedia>? socialMedia;
UserData({this.name, this.email, this.phone, this.info, this.socialMedia});
UserData.fromJson(Map<String, dynamic> json) {
name = json['name'];
email = json['email'];
phone = json['phone'];
info = json['info'];
if (json['social_media'] != null) {
socialMedia = <SocialMedia>[];
json['social_media'].forEach((v) {
socialMedia!.add(new SocialMedia.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['name'] = this.name;
data['email'] = this.email;
data['phone'] = this.phone;
data['info'] = this.info;
if (this.socialMedia != null) {
data['social_media'] = this.socialMedia!.map((v) => v.toJson()).toList();
}
return data;
}
}
class SocialMedia {
String? link;
int? socialMediaId;
SocialMedia({this.link, this.socialMediaId});
SocialMedia.fromJson(Map<String, dynamic> json) {
link = json['link'];
socialMediaId = json['social_media_id'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['link'] = this.link;
data['social_media_id'] = this.socialMediaId;
return data;
}
}
你也可以这样做:
var mainObj ={};
var socialMedia = [];
mainObj["name"] = "myName";
mainObj["email"] = "myEmail";
mainObj["phone"] = "0323456789";
mainObj["info"] = "myDescription";
for(int j=0;j<3; j++){
var innerObj ={};
innerObj["link"] = "$j link";
innerObj["social_media_id"] = j;
socialMedia.add(innerObj);
}
mainObj["social_media"] = socialMedia;
print(jsonEncode(mainObj));
只需将此jsonEncode(mainObj)
传递给http.post
方法的body
编辑
var socialMedia = [];
for(int j=0;j<3; j++){
var innerObj ={};
innerObj["link"] = "$j link";
innerObj["social_media_id"] = j;
socialMedia.add(innerObj);
}
Map<String, String> data = {
"name" : "myName",
"email" : "myEmail",
"phone" : "0323456789",
"info" : "myDescription",
"social_media" : socialMedia.toString()
} ;
var request = new MultipartRequest("POST", Uri.parse('apiUrl'));
request.fields.addAll(data);
request.send().then((response) {
if (response.statusCode == 200) print("done!");
});
如果我的API需要接受这种类型的数据
{
"name": "myName",
"email": "myEmail,
"phone": "0323456789",
"info": "myDescription",
"social_media": [
{
"link":"First link"
"social_media_id": 1
}
{
"link":"First link"
"social_media_id": 1
}
{
"link":"First link"
"social_media_id": 1
}
]
}
然后我在我的方法中使用以下代码发送该数据,但我得到的响应是(未处理的异常:类型 '_InternalLinkedHashMap
for(int i=0;i<3;i++)
{
_socialList.add(
{
"link":_controllers[i].text,
"social_media_id": 1,
},);
}
Map<String, dynamic> data={
"name":userNameController.text,
"email":emailController.text,
"phone":phoneController.text,
"info": detailsController.text,
"social_media": _socialList
};
var stream= new http.ByteStream(image.openRead());
stream.cast();
var length= await image.length();
var request= new http.MultipartRequest('POST', url);
request.fields.addAll(data);
var multiPort= new http.MultipartFile('file', stream, length,
filename: image.path);
request.files.add(multiPort);
var response=await request.send();
第 1 步:
Future<List<=UserData>> fetchResults() async {
List< UserData> _results = [];
var url ="---your link----";
var response = await http.get(url);
if (response.statusCode == 200) {
var resultsJson = json.decode(response.body).cast<Map<String,dynamic>>();
await Future.forEach(resultsJson, (element) {
_results.add(UserData.fromJson(element));
});
}
return Future.value(_results);
}
第 2 步:
class UserData {
String? name;
String? email;
String? phone;
String? info;
List<SocialMedia>? socialMedia;
UserData({this.name, this.email, this.phone, this.info, this.socialMedia});
UserData.fromJson(Map<String, dynamic> json) {
name = json['name'];
email = json['email'];
phone = json['phone'];
info = json['info'];
if (json['social_media'] != null) {
socialMedia = <SocialMedia>[];
json['social_media'].forEach((v) {
socialMedia!.add(new SocialMedia.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['name'] = this.name;
data['email'] = this.email;
data['phone'] = this.phone;
data['info'] = this.info;
if (this.socialMedia != null) {
data['social_media'] = this.socialMedia!.map((v) => v.toJson()).toList();
}
return data;
}
}
class SocialMedia {
String? link;
int? socialMediaId;
SocialMedia({this.link, this.socialMediaId});
SocialMedia.fromJson(Map<String, dynamic> json) {
link = json['link'];
socialMediaId = json['social_media_id'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['link'] = this.link;
data['social_media_id'] = this.socialMediaId;
return data;
}
}
你也可以这样做:
var mainObj ={};
var socialMedia = [];
mainObj["name"] = "myName";
mainObj["email"] = "myEmail";
mainObj["phone"] = "0323456789";
mainObj["info"] = "myDescription";
for(int j=0;j<3; j++){
var innerObj ={};
innerObj["link"] = "$j link";
innerObj["social_media_id"] = j;
socialMedia.add(innerObj);
}
mainObj["social_media"] = socialMedia;
print(jsonEncode(mainObj));
只需将此jsonEncode(mainObj)
传递给http.post
方法的body
编辑
var socialMedia = [];
for(int j=0;j<3; j++){
var innerObj ={};
innerObj["link"] = "$j link";
innerObj["social_media_id"] = j;
socialMedia.add(innerObj);
}
Map<String, String> data = {
"name" : "myName",
"email" : "myEmail",
"phone" : "0323456789",
"info" : "myDescription",
"social_media" : socialMedia.toString()
} ;
var request = new MultipartRequest("POST", Uri.parse('apiUrl'));
request.fields.addAll(data);
request.send().then((response) {
if (response.statusCode == 200) print("done!");
});