如何在 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!");
   });